Реализовать внешний ключ в базе данных или в приложении? - PullRequest
0 голосов
/ 29 мая 2009

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

[Примечание: поскольку белая точка указывает «необязательно», а черная точка «требуется», для каждой категории соответствующая классифицированная классификация может существовать или не существовать. Кроме того, гусиные лапки между ними указывают на то, что это отношение многих ко многим.]

alt text

Ответы [ 3 ]

4 голосов
/ 29 мая 2009

Поскольку это отношение «многие ко многим», вам понадобится таблица перекрестных ссылок, а не простой столбец внешнего ключа.

Таким образом, в таблице «Категория» нет FK для категории «Классифицировано», а для категории «Классификация» нет категории FK для категории. Вместо этого вы можете иметь новую таблицу:

XrefCategoryClassified
  FK to Category NOT NULL
  FK to Classified NOT NULL

Это типичный способ реализации отношения «многие ко многим». И теперь, вместо того, чтобы беспокоиться о пустых полях, если две записи не связаны, вы просто заботитесь о существовании или несуществовании записи внешней ссылки

3 голосов
/ 29 мая 2009

Почему бы не использовать оба?

Внешние ключи, проверочные ограничения и т. Д. По определенной причине известны как «декларативная ссылочная целостность». Они защищают ваши данные. Что если вы добавите массовую загрузку в следующем месяце или вам потребуется запустить SQL-скрипт для изменения данных?

Другой момент заключается в том, что ядро ​​базы данных является правильным инструментом для этого.

1 голос
/ 29 мая 2009

При отсутствии веских причин поступить иначе, я бы обеспечил ссылочную целостность на уровне базы данных; в конце концов, это (частично) то, для чего хороша RDBS.

И поскольку у вас, скорее всего, будет какая-то таблица сопоставления для определения отношения «многие ко многим» между категориями и классифицированными, кажется, что вводить ваши ограничения там не составит труда. Ваши вопросы будут благодарны вам за это позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...