Выявление отношений один-ко-многим - PullRequest
4 голосов
/ 11 августа 2011

У меня есть несколько вопросов о том, как определить отношение один ко многим.Я прочитал некоторые другие связанные вопросы о переполнении стека, но мне нужно немного больше информации:)

Предположим, у нас есть таблица "Страна" и таблица "Города".Мне кажется, что это пример отношения «один ко многим».Но когда я использую MySql Workbench для создания идентифицирующих отношений «один ко многим» между этими двумя таблицами, я получаю следующее:

Countries
---------
country_id (PK)
...

Cities
--------
city_id    (PK)
country_id (PK)
...

У нас есть составной первичный ключ в таблице Cities, и он позволит следующие строки в этомtable (допустим, что country_id и city_id являются строками для лучшей читабельности):

1) France, Paris
2) England, London
3) England, Manchester
4) France, London

Чтобы это было правильно, нам нужно установить ограничение UNIQUE для city_id, чтобы оно могло принадлежать только одной стране.Но разве не более понятно, чем просто сделать country_id как NOT_NULL (FK) в таблице Cities и получить тот же эффект:

Cities
---------
city_id (PK)
country_id (FK) (NOT_NULL) 

Итак, это идентифицирующая или неидентифицирующая связь?Мне кажется, что это «логически идентифицирующий», но по определению он не идентифицирующий, так как родительский PK не является частью дочернего PK.Это немного сбивает с толку:)

Ответы [ 3 ]

6 голосов
/ 11 августа 2011

Если ключом города является (country_id, city_id), то отношение является «идентифицирующим», что означает, что первичный ключ является частично или полностью ссылкой внешнего ключа на другую таблицу. Если country_id не является частью первичного ключа, он не идентифицируется.

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

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

2 голосов
/ 11 августа 2011

По определению идентифицирующее отношение использует первичный ключ указанной записи.

Ваше последнее решение выглядит так, как вам нужно.Но это не идентифицирующее отношение.

2 голосов
/ 11 августа 2011

В вашем собственном примере данных встречный аргумент для вашего предложения. London появляется как город в Англии и Франции, но это не один и тот же город; Город идентифицируется не по city_id, то есть по названию города, а по паре country_id, city_id. Нет другого естественного ключа для такого рода данных. Если вам нужен первичный ключ из одного столбца, вам придется изобрести суррогатный ключ, который будет действовать как первичный ключ (скажем, автоинкрементное целое число)

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