Двунаправленное ограничение внешнего ключа

Месяц назад мне записали эту небольшую программу в Python (для работы), который анализирует журналы. Когда тогда количество файлов журнала выросло, программа, которая, как начинают, была очень медленной, и я думал, что мог переписать его в Java.

я был очень интересен. Потребовался целый день для миграции того же алгоритма от Python до Java. В конце дня несколько пробных версий сравнительного теста показали мне ясно, что программа Java была приблизительно на 20% / 25% медленнее, чем ее дубликат Python. Это было удивление мне.

Запись во второй раз алгоритм также показал мне, что некоторая оптимизация была возможна. Таким образом за два часа я полностью переписал все это в Python, и это было приблизительно на 40% быстрее, чем исходная реализация Python (следовательно заказы времени быстрее, чем версия Java, которую я имел).

Так:

  1. Python является медленным языком, но тем не менее это может быть быстрее для определенных задач, что другие, предположительно, более быстрые языки

  2. , Если необходимо провести время, пишущий что-то на языке, выполнение которого быстрее, но чье время разработки медленнее (большинство языков), рассмотрите использование того же времени, чтобы проанализировать проблему, поиск библиотек, профиля и затем записать лучший код Python.

6
задан jthg 22 October 2009 в 15:10
поделиться

5 ответов

«Я считаю, что это невозможно. Вы не можете создать запись адреса, пока не знаете идентификатор человека, и вы не можете вставить запись человека, пока не знаете AddressId для поля PrimaryAddressId.»

На первый взгляд это утверждение выглядит ТАК привлекательным. Однако это довольно настойчиво.

Это очень распространенный вид проблемы, которую поставщики СУБД SQL пытаются атаковать уже, возможно, десятилетия.

Ключ в том, что все проверки ограничений должны быть «отложены» до тех пор, пока оба вставки сделаны. Этого можно добиться разными способами. Транзакции базы данных могут предлагать возможность сделать что-то вроде «УСТАНОВИТЬ проверку отложенных ограничений ВКЛ», и все готово (если бы не тот факт, что в этом конкретном примере вы Мне, вероятно, придется очень сильно повозиться с вашим дизайном, чтобы иметь возможность просто ОПРЕДЕЛИТЬ два ограничения FK, потому что одно из них просто НЕ ЯВЛЯЕТСЯ «истинным» FK в смысле SQL!)

Решения на основе триггеров описанные здесь, достигают по существу того же эффекта, но они подвержены всем проблемам обслуживания, которые существуют с принудительной целостностью приложений.

В своей работе Крис Дэйт и Хью Дарвен описывают, что является истинным решением проблемы: множественные назначение. Это, по сути, возможность составить несколько отдельных операторов обновления и заставить СУБД действовать на них, как если бы это был один-единственный оператор. Реализации этой концепции действительно существуют, но вы не найдете ни одной, говорящей на языке SQL.

FK в смысле SQL!).

Решения на основе триггеров, описанные здесь, достигают, по сути, того же эффекта, но они подвержены всем проблемам обслуживания, которые существуют с целостностью, обеспечиваемой приложением.

В своей работе Крис Дэйт И Хью Дарвен описывают истинное решение проблемы: множественное назначение. Это, по сути, возможность составить несколько отдельных операторов обновления и заставить СУБД действовать с ними, как если бы это был один-единственный оператор. Реализации этой концепции действительно существуют, но вы не найдете ни одной, говорящей на языке SQL.

FK в смысле SQL!).

Решения на основе триггеров, описанные здесь, достигают по существу того же эффекта, но они подвержены всем проблемам обслуживания, которые существуют с целостностью, обеспечиваемой приложением.

В своей работе Крис Дейт И Хью Дарвен описывают истинное решение проблемы: множественное назначение. Это, по сути, возможность составить несколько отдельных операторов обновления и заставить СУБД действовать на них, как если бы это был один-единственный оператор. Реализации этой концепции действительно существуют, но вы не найдете ни одной, говорящей на языке SQL.

Хью Дарвен описывает истинное решение проблемы: множественное назначение. Это, по сути, возможность составить несколько отдельных операторов обновления и заставить СУБД действовать на них, как если бы это был один-единственный оператор. Реализации этой концепции существуют, но вы не найдете ни одной, говорящей на языке SQL.

Хью Дарвен описывает истинное решение проблемы: множественное назначение. Это, по сути, возможность составить несколько отдельных операторов обновления и заставить СУБД действовать на них, как если бы это был один-единственный оператор. Реализации этой концепции действительно существуют, но вы не найдете ни одной, говорящей на языке SQL.

11
ответ дан 8 December 2019 в 17:23
поделиться

Мы отмечаем первичный адрес в нашей таблице адресов, а затем получаем триггеры, которые заставляют только запись, которую может иметь человек (но она должна быть у одной записи). Если вы измените основной адрес, он обновит старый основной адрес, а также новый. Если вы удалите первичный адрес, а другие адреса существуют, один из них (на основе ряда правил) будет повышен до первичного адреса. Если адрес вставлен и является первым вставленным адресом, он автоматически помечает этот адрес как первичный.

2
ответ дан 8 December 2019 в 17:23
поделиться

Это прекрасный пример отношения «многие ко многим». Чтобы решить эту проблему, у вас должна быть промежуточная таблица PERSON_ADDRESS. Другими словами;

PERSON table
person_id (PK)

ADDRESS table
address_id (PK)

PERSON_ADDRESS
person_id (FK) <= PERSON
address_id (FK) <= ADDRESS
is_primary (BOOLEAN - Y/N)

Таким образом, вы можете назначить несколько адресов ЛИЧНОМУ, а также повторно использовать записи АДРЕСОВ для нескольких ЛИЦ (для членов семьи, сотрудников одной компании и т. Д.). Используя поле is_primary в таблице PERSON_ADDRESS, вы можете определить, является ли эта комбинация person_addrees основным адресом человека.

2
ответ дан 8 December 2019 в 17:23
поделиться

Второй FK (PersonId from Address to Person) слишком ограничительный, ИМХО. Вы предлагаете, чтобы один адрес мог иметь только один человек?

0
ответ дан 8 December 2019 в 17:23
поделиться

Исходя из вашего дизайна, кажется, что адрес может применяться только к одному человеку, поэтому просто используйте PersonID как ключ к таблице адресов и опустите поле ключа AddressID.

0
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: