Все еще запутался в идентификации и неидентификации отношений - PullRequest
73 голосов
/ 12 мая 2010

Итак, я читал об идентификации и неидентификации отношений в моей структуре базы данных, и некоторые ответы на SO кажутся мне противоречащими. Вот два вопроса, на которые я смотрю:

  1. В чем разница между идентифицирующими и неидентифицирующими отношениями
  2. Проблемы при определении идентифицирующих или неидентифицирующих отношений

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

В ответе на первый вопрос говорится, что идентифицирующая связь «описывает ситуацию, в которой существование строки в дочерней таблице зависит от строки в родительской таблице». Примером этого является: «Автор может написать много книг (отношение 1 к n), но книга не может существовать без автора». Это имеет смысл для меня.

Однако, когда я читаю ответ на второй вопрос, я смущаюсь, когда он говорит: «Если ребенок идентифицирует своего родителя, это идентифицирующие отношения». Затем в ответе приводятся примеры, такие как Номер социального страхования (идентифицирует человека), но адрес не является (поскольку многие люди могут жить по адресу). Для меня это больше похоже на случай выбора между первичным ключом и не первичным ключом.

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

Ответы [ 8 ]

146 голосов
/ 12 мая 2010

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

CREATE TABLE AuthoredBook (
  author_id INT NOT NULL,
  book_id INT NOT NULL,
  PRIMARY KEY (author_id, book_id),
  FOREIGN KEY (author_id) REFERENCES Authors(author_id),
  FOREIGN KEY (book_id) REFERENCES Books(book_id)
);

См? book_id - это внешний ключ, но он также является одним из столбцов в первичном ключе. Таким образом, эта таблица имеет идентифицирующую связь с ссылочной таблицей Books. Точно так же он имеет идентифицирующую связь с Authors.

Комментарий к видео YouTube имеет идентифицирующую связь с соответствующим видео. video_id должен быть частью первичного ключа таблицы Comments.

CREATE TABLE Comments (
  video_id INT NOT NULL,
  user_id INT NOT NULL,
  comment_dt DATETIME NOT NULL,
  PRIMARY KEY (video_id, user_id, comment_dt),
  FOREIGN KEY (video_id) REFERENCES Videos(video_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
);

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

CREATE TABLE Comments (
  comment_id SERIAL PRIMARY KEY,
  video_id INT NOT NULL,
  user_id INT NOT NULL,
  comment_dt DATETIME NOT NULL,
  FOREIGN KEY (video_id) REFERENCES Videos(video_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
);

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

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


Комментарий от @Niels:

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

Полагаю, так. Я не решаюсь сказать «да», потому что мы не изменили логическое отношение 1033 * между таблицами, используя суррогатный ключ. То есть вы по-прежнему не можете оставлять комментарии, не ссылаясь на существующее видео. Но это просто означает, что video_id должен быть NOT NULL. И логический аспект, для меня, действительно заключается в определении отношений.

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

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

19 голосов
/ 12 мая 2010

«поскольку я не хочу учить что-то неправильное».

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

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

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

10 голосов
/ 12 мая 2010

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

Например, предположим, что в вашей таблице используются два ключа-кандидата, A и B. Предположим, что A также является внешним ключом в этой таблице. Представленная таким образом взаимосвязь считается «идентифицирующей», если A обозначена как «первичный» ключ, но она не идентифицирует, если B является первичным ключом. Тем не менее, форма, функция и значение таблицы идентичны в каждом случае! Вот почему, по моему мнению, концепция идентификации / неидентификации действительно не очень важна.

9 голосов
/ 23 декабря 2013

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

6 голосов
/ 02 сентября 2014

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

Лучшее определение, которое я видел, это «идентифицирующее отношение включает в себя PK как родительского в дочернем PK. Другими словами, PK дочернего объекта включает в себя FK для родителя, а также« фактический »PK ребенок.

1 голос
/ 18 декабря 2013

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

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

1 голос
/ 12 мая 2010

Да, иди с первым, но я не думаю, что второе противоречит первому. Это просто немного сбивает с толку ..

UPDATE:

Только что проверил - ответ на второй вопрос неверен в некоторых предположениях, .. автор книги не обязательно является отношением 1: n, как это может быть m: n. В реляционных базах данных, которые создают таблицу пересечений для этого отношения m: n, вы получаете идентифицирующие отношения между таблицей пересечений и этими двумя другими таблицами.

0 голосов
/ 25 ноября 2018

Идентифицирующие отношения - это действительно концепция ERD, поскольку это область концептуального моделирования, моделирующего наше понимание «вселенной дискурса». Это родительско-дочерние отношения, в соответствии с которыми мы моделируем тот факт, что идентичность каждого дочернего объекта (по крайней мере частично) устанавливается / определяется идентичностью родительского объекта. Поэтому он обязателен и неизменен.

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

Именно эти качества и использование реляционных конструкций dbms приводят к тому, что PK ребенка является составным ключом, который включает через FK PK родителя. Как PK, личность ребенка является обязательной и неизменной (она не может измениться). «Изменение» в PK фактически создает новый объект. Поэтому PK не должен быть в состоянии изменить. Неизменность PK также должна быть ограничена. Ограничения БД могут быть использованы для реализации этого качества PK.

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