Яка різниця між ідентифікаційними та неідентифікаційними стосунками?


800

Я не зміг повністю зрозуміти відмінності. Чи можете ви описати обидва поняття та використати приклади реального світу?


11
відповіді на це питання настільки заплутані, що не смішно
Денніс

Добре питання, колесо не винаходиться: Пітер Чен. Модель відносин між особами , на шляху до єдиного перегляду даних, 1976, § 2.3.2: " Якщо відносини використовуються для ідентифікації сутностей, ми називаємо це слабким відношенням сутності. Якщо відносини не використовуються для ідентифікації суб'єктів, ми зателефонуємо це регулярне відношення сутності ". Питання про ОП зводиться до: Що таке слабкі / регулярні відносини між суб'єктами господарювання? .
хв.

Відповіді:


1063
  • Ідентифікації відносин , коли існування рядки в дочірній таблиці залежить від рядка в батьківській таблиці. Це може бути заплутаним, оскільки в наші дні прийнято створювати псевдокілька для дочірньої таблиці, але не робити зовнішній ключ до батьківської частини первинного ключа дитини. Формально "правильний" спосіб зробити це - зробити зовнішній ключ частиною первинного ключа дитини. Але логічна залежність полягає в тому, що дитина не може існувати без батька.

    Приклад: А Personмає один або більше номерів телефонів. Якби у них був лише один номер телефону, ми могли б просто зберегти його у стовпці Person. Оскільки ми хочемо підтримувати декілька телефонних номерів, ми робимо другу таблицю PhoneNumbers, в основний ключ якої person_idпосилається Personтаблиця.

    Ми можемо вважати, що номери телефонів належать людині, навіть якщо вони моделюються як атрибути окремої таблиці. Це сильна підказка, що це ідентифікаційні відносини (навіть якщо ми їх буквально не включаємо person_idв первинний ключ PhoneNumbers).

  • Чи не ідентифікують відносини , коли первинний ключ атрибутів батька не повинен стати первинним ключем атрибутів дитини. Хорошим прикладом цього є таблиця пошуку, наприклад, зовнішній ключ щодо Person.stateпосилання на первинний ключ States.state. Person- це дочірня таблиця стосовно States. Але ряд в Personідентифікується не за його stateатрибутом. Тобто stateне є частиною первинного ключа Person.

    Неідентифікаційне співвідношення може бути необов'язковим або обов'язковим , що означає, що стовпець із зовнішнім ключем дозволяє NULL або забороняє NULL відповідно.


Дивіться також мою відповідь до все ще плутаного щодо виявлення та невизначення відносин


9
+1: Білл, "в наші дні прийнято створювати псевдокілька для дитячої таблиці, але не робити зовнішній ключ до батьківської частини первинного ключа дитини" - будь-які посилання на те, чому це так? Google мене не дає.
hobodave

17
Здається, що "правильне" побудова ідентифікаційних зв'язків призведе до жахливо величезних первинних ключів. наприклад, будівля має підлогу, номер має ліжко. ПК для ліжка буде (bed_id, floor_id, room_id, building_id). Дивно здається, що я ніколи цього не бачив на практиці, ні чув, як це пропонується як спосіб зробити що-небудь. Це багато зайвих даних у ПК.
hobodave

24
@hobodave: Я бачив багатоколонкові первинні ключі, які ще більше. Але я приймаю вашу думку. Вважайте, що багатоколонкові первинні ключі передають більше інформації; ви можете запросити Bedsтаблицю для всіх місць в конкретному будинку , не роблячи будь-які з'єднання.
Білл Карвін

2
@Eugene, так, я б очікував, що це стосунки, що не визначаються. user_idмає бути первинним ключем сам по собі, а updated_byне є частиною багатоколонного первинного ключа.
Білл Карвін

4
Я ніколи не буду використовувати це для моделювання цього. Найкраща відповідь - з "aqsa rao" нижче, де зазначено наступне: "Ідентифікаційний зв'язок означає, що дочірню таблицю неможливо однозначно ідентифікувати без батьків". Тому що ваше визначення додає непотрібну семантику, яка може заплутати людей. Це не залежність між сутностями, а причина, по якій ви створюєте ідентифікаційні або неідентифікаційні відносини.
Себастьян

887

Є ще одне пояснення з реального світу:

Книга належить власнику, і власник може володіти кількома книгами. Але книга може існувати і без власника, і право власності на неї може змінюватися від одного власника до іншого. Взаємовідносини книги та власника - це неідентифікаційні відносини.

Проте книгу пише автор, і автор міг написати кілька книг. Але книгу має писати автор - вона не може існувати без автора. Тому відносини між книгою та автором є ототожнюючими відносинами.


2
Гідне пояснення, але я вважаю, що це також повчально розширити приклад. Книга має ряд сторінок. Він не може існувати без сторінок, і тому ми можемо зробити висновок, що зв’язок між книгою та кількістю сторінок у неї є також ідентифікаційним співвідношенням. Але чи буде атрибут кількості сторінок частиною будь-якої схеми ідентифікації (ключа) книги? Напевно, ні. Термін "ідентифікаційний взаємозв'язок" зазвичай зарезервований для відносин, що включають ідентифікаційні атрибути - прості атрибути у реляційних термінах.
nvogel

13
Що станеться, якщо книгу написав більше 1 автора? Це більше не визначає відносини як тип M: N, чому?
NGix

2
Ці реальні приклади марні. Коли ви усвідомлюєте, як створюєте таблиці в ER та як буде триматися цілісність даних, ви відкинете ці приклади. Якщо ви створюєте міцний зв'язок між двома сутностями, ви змушуєте створити первинний ключ у таблиці сутностей у поєднанні з ПК в іншому об'єкті. Якщо ваша модель дозволяє вам, що в одній книзі може бути кілька авторів, тоді добре бути сильним. Але якщо ваша модель дозволяє вам лише 1 автор 1 книгу, ви не можете мати це обмеження, використовуючи міцні стосунки, оскільки PK(Book.id, Book.person_id).
Себастьян

2
але справжнє використання "чи може книга існувати без автора?". Відповідь "так" насправді, адже люди будуть шукати книгу безпосередньо. Тому на практиці для цього випадку вони повинні бути завжди "неідентифікуючими відносинами".
windmaomao

3
що відбувається хлопці !!, це не вагомий приклад the Identifying relationship !!! так, книга не може бути написана без автора, але поле автора в таблиці книг НЕ Ідентифікує рядок книг !!!
Бухгалтер з

33

Відповідь Білла правильна, але шокуюче бачити, що серед усіх інших відповідей ніхто не вказує на найбільш вагомий аспект.

Повторно і знову говориться, що в ідентифікуванні стосунків дитина не може існувати без батька. (наприклад, user287724 ). Це правда, але повністю пропускає суть. Достатньо, щоб зовнішній ключ був ненульовим, щоб досягти цього. Він не повинен бути частиною первинного ключа.

Тож ось справжня причина:

Мета ідентифікаційного зв’язку полягає в тому, щоб зовнішній ключ НІКОЛИ не міняв , тому що він є частиною первинного ключа ... тому ідентифікуючи !!!


2
+1 для "Для цього достатньо, щоб зовнішній ключ був ненульовим, щоб досягти цього". Цього має бути достатньо, але, на жаль, це не тоді, коли мова йде про щось на зразок Entity Framework, що не працює правильно, якщо ви не використовуєте ідентифікаційні відносини, але тоді поле "Id" суб'єкта втрачає унікальність у результаті просто частина складеного ключа.
Трайнко

25

Ідентифікаційне співвідношення вказує, що дочірній об’єкт не може існувати без батьківського об'єкта

Неідентифікаційні відносини визначають регулярну асоціацію між об'єктами, кардинальність 1: 1 або 1: n.

Неідентифікуючі відносини можна вказати як необов'язкові, коли батько не потрібен або обов'язковий, коли батько потрібен, встановивши кардинальність батьківської таблиці ...


6
Це звучить скоріше як опис загальної участі у відносинах, ніж виявлення відносин.
Томас Падрон-Маккарті

1
Ви буквально змагаєтесь з хлопцем, який має репутацію 218k. Просто кидаючи це там, бо ви обоє точно знаєте більше, ніж я.
Marc DiMillo

Я не згоден з вищезазначеними визначеннями. У вас може бути об'єкт, який залежить від його батьківського виклику, і ви хочете, щоб цей об'єкт був обмежений пов'язаним лише з 1 батьківським рядком. А Houseмає Wallс. Ви прибираєте будинок, і у вас немає стін. Але стіна належить лише будинку. Так що міцні стосунки не спрацюють: PK(Wall.id, House.id)дозволять вставити в модель ту саму стіну до іншого будинку.
Себастьян

15

Ось хороший опис:

Відносини між двома суб'єктами можуть бути класифіковані як "ідентифікуючі" або "неідентифікуючі". Ідентифікаційні зв'язки існують, коли первинний ключ материнської сутності включений у первинний ключ дочірньої сутності. З іншого боку, неідентифікуючі відносини існують, коли первинний ключ материнської сутності включений у дочірнє сутність, але не є частиною первинного ключа дочірньої сутності. Крім того, неідентифікаційні відносини можуть бути додатково класифіковані як "обов'язкові" або "не обов'язкові". Обов'язкове неідентифікаційне відношення існує, коли значення в дочірній таблиці не може бути нульовим. З іншого боку, необов'язкове неідентифікаційне відношення існує, коли значення в дочірній таблиці може бути нульовим.

http://www.sqlteam.com/article/database-design-and-modeling-fundamentals

Ось простий приклад виявлення відносин:

Parent
------
ID (PK)
Name

Child
-----
ID (PK)
ParentID (PK, FK to Parent.ID) -- notice PK
Name

Ось відповідне неідентифікаційне відношення:

Parent
------
ID (PK)
Name

Child
-----
ID (PK)
ParentID (FK to Parent.ID) -- notice no PK
Name

1
Ваша відповідь суперечить тому, що дав Білл Карвін, в різниці між тим, чи зовнішній ключ "ні" чи "не повинен" бути частиною первинного ключа в дочірньому ряду.
Ніколь

@Andy White Але чи може первинний ключ батьківського в ідентифікаційному взаємозв'язку бути необов'язковим, тобто нульовим, коли він є частиною складеного первинного ключа з трьох стовпців?
Фредерік Краутвальд

10

Відповідь користувача 287724 дає такий приклад стосунків книги та автора:

Однак книга написана автором, і автор міг написати кілька книг. Але книгу має писати автор, вона не може існувати без автора. Тому відносини між книгою та автором є ідентифікаційними відносинами.

Це дуже заплутаний приклад і, безумовно, не є дійсним прикладом для identifying relationship.

Так, bookне може бути написана без принаймні одного author, але author(це зовнішній ключ) з bookце НЕ ВИЗНАЧИТИbook в booksтаблиці!

Ви можете видалити author(FK) з bookрядка і до сих пір можна визначити книгу рядки якої - або іншій області ( ISBN, ID, ... і т.д.), але не автор книги !!

Я думаю, що вагомим прикладом документа identifying relationshipможе бути співвідношення між (таблиця продуктів) та (таблиця конкретних продуктів)1:1

products table
+------+---------------+-------+--------+
|id(PK)|Name           |type   |amount  |
+------+---------------+-------+--------+
|0     |hp-laser-510   |printer|1000    |
+------+---------------+-------+--------+
|1     |viewsonic-10   |screen |900     |
+------+---------------+-------+--------+
|2     |canon-laser-100|printer|200     |
+------+---------------+-------+--------+

printers_details table
+--------------+------------+---------+---------+------+
|Product_ID(FK)|manufacturer|cartridge|color    |papers|
+--------------+------------+---------+---------+------+
|0             |hp          |CE210    |BLACK    |300   |
+--------------+------------+---------+---------+------+
|2             |canon       |MKJ5     |COLOR    |900   |
+--------------+------------+---------+---------+------+
* please note this is not real data

У цьому прикладі Product_IDв printers_detailsтаблиці вважається FK посилається на products.idтаблицю, А також ПК у printers_detailsтаблиці, це ідентифікаційне співвідношення, оскільки Product_ID(FK) у таблиці принтерів Ідентифікує рядок всередині дочірньої таблиці, ми не можемо видалити product_idз таблиці дитини , тому що ми не можемо визначити рядки більше , тому що ми втратили це первинний ключ

Якщо ви хочете розмістити його в 2 рядки:

ідентифікаційне співвідношення - це відношення, коли ФК у дочірній таблиці вважається ПК (або ідентифікатором) у дочірній таблиці, поки він посилається на батьківську таблицю

Інший приклад може бути, коли у вас є три таблиці (імпорт - продукція - країни) для імпорту та експорту для деяких країн

importТаблиця є дитина , який має наступні поля ( product_id(ФК), то country_id(FK), обсяг імпорту, ціна, одиниці імпорту шлях транспорту (повітря, море)) we may use the (product_id , thecountry_id`) для ідентифікації кожного рядок імпорту "якщо вони всі в тому ж році", тут обидва стовпці можуть складати первинний ключ у дочірній таблиці (імпорт), а також посилаючись на там батьківські таблиці.

Будь ласка, я щасливий, що я нарешті зрозумів концепцію, identifying relationshipі non identifying relationship, будь ласка, не кажіть мені, що я помиляюся з усіма цими голосуваннями за абсолютно недійсний приклад

Так, логічно книга не може бути написана без автора, але книгу можна ідентифікувати без автора. Насправді вона не може бути ототожнена з автором!

Ви можете 100% видалити автора з рядка книги і все одно можете ідентифікувати книгу! .


5
Ви маєте рацію, якщо у вас є лише книги та автори таблиць. Тут немає ідентифікаційних відносин. Але якщо ви використовуєте третю таблицю для представлення відносин "багато-багато", первинний ключ цієї третьої таблиці складається з двох зовнішніх ключів, що посилаються на таблицю книг та таблицю авторів. Ця таблиця визначає стосунки як до книг, так і до авторів. Дивіться мій приклад в stackoverflow.com/questions/2814469/…
Білл Карвін

8

Неідентифікаційні відносини

Неідентифікаційні відносини означають, що дитина пов'язана з батьком, але її можна ідентифікувати самостійно.

PERSON    ACCOUNT
======    =======
pk(id)    pk(id)
name      fk(person_id)
          balance

Зв'язок між ACCOUNT та PERSON не визначається.

Виявлення стосунків

Виявлення стосунків означає, що батько потрібен, щоб дати особу дитині. Дитина існує виключно через батьків.

Це означає, що зовнішній ключ є і первинним ключем.

ITEM      LANGUAGE    ITEM_LANG
====      ========    =========
pk(id)    pk(id)      pk(fk(item_id))
name      name        pk(fk(lang_id))
                      name

Зв'язок між ITEM_LANG та ITEM виявляється. І між ITEM_LANG та LANGUAGE теж.


2
Як ОСОБА та ОБЛІК не ідентифікують? Як ОБЛАДНАННЯ може існувати без ОСОБИ?
MrRobot9,

чому немає відповіді на попередній коментар? @ MrRobot9
AAEM

4

Якщо ви вважаєте, що дочірній елемент слід видалити, коли батьків вилучено, то це ідентифікаційні відносини.

Якщо дочірній елемент слід зберігати, навіть якщо батьківський вилучений, це відношення, що не визначає.

Як приклад, я маю базу даних навчальних курсів зі слухачами, тренінги, дипломи та навчальні заняття:

  • слухачі мають ідентифікаційний зв’язок із навчальними заняттями
  • тренінги мають ідентифікаційний зв’язок із навчальними заняттями
  • але слухачі не мають ідентифікаційних стосунків з дипломами

Видаляються лише навчальні заняття, якщо вилучений один із пов’язаних слухачів, навчання чи диплом.


3

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

Взаємозв'язок неідентифікації означає, що дочірня таблиця не ідентифікується за наявністю прикладу батьківської таблиці. Є таблиця як тип облікового запису та рахунок account.accounttype не ідентифікується із наявністю таблиці рахунків.


2

Як добре пояснено у нижченаведеному посиланні, ідентифікаційне відношення дещо нагадує слабке відношення типу сутності до свого батьківського в концептуальній моделі ER. CAD стилі UML для моделювання даних не використовують символи чи поняття ER, а тип відносин: ідентифікаційний, неідентифікаційний та неспецифічний.

Ідентифікуючі стосунки - це стосунки батька / дитини, де дитина є слабким утворенням (навіть у традиційній моделі ЕР його називають ідентифікаційним відношенням), який не має реального первинного ключа за власними атрибутами і тому не може бути визначений однозначно власним . Кожен доступ до дочірньої таблиці, за фізичною моделлю, буде залежати (включаючи семантично) від первинного ключа батьків, який перетворюється на частину або загальну кількість первинного ключа дитини (також є іноземним ключем), що, як правило, призводить до складеного ключа з боку дитини. Можливі існуючі ключі самої дитини є лише псевдо або частковими ключами, недостатніми для ідентифікації жодного примірника цього типу сутності чи сутності, без ПК батька.

Неідентифікуючі відносини - це звичайні відносини (часткові чи тотальні) повністю незалежних наборів сутностей, екземпляри яких не залежать від первинних ключів один одного, щоб бути однозначно ідентифікованими, хоча їм можуть знадобитися зовнішні ключі для часткових або повних відносин, але не як основний ключ дитини. У дитини є свій первинний ключ. Батьківський ідем. Обидва незалежно. Залежно від кардинальності відносин, ПК одного переходить як ФК в інший (N сторона), і якщо частковий, може бути недійсним, якщо є загальним, не повинен бути нульовим. Але, у таких відносинах, ФК ніколи не буде також ПК дитини, як коли це стосується виявлення відносин.

http://docwiki.embarcadero.com/ERStudioDA/XE7/uk/Creating_and_Editing_Relationships


2

Чи допомагають атрибути, перенесені від батьків до дитини, ідентифікувати 1 дитину?

  • Якщо так : ідентифікаційна залежність існує, зв’язок виявляється, і дочірнє утворення є "слабким".
  • Якщо ні : залежність від ідентифікації не існує, зв’язок неідентифікується, а дочірнє утворення "сильне".

Зауважте, що ідентифікаційна залежність передбачає залежність від існування, але не навпаки. Кожен не-NULL FK означає, що дитина не може існувати без батька, але це само по собі не може визначити стосунки.

Докладніше про це (та деякі приклади) дивіться у розділі "Виявлення відносин" у Посібнику з методів ERwin .

PS Я усвідомлюю, що я (вкрай) запізнююсь на партію, але я вважаю, що інші відповіді або не зовсім точні (визначаючи це в залежності від існування, а не ідентифікаційної залежності), або дещо химерні. Сподіваємось, ця відповідь надає більше ясності ...


1 ФК дитини є частиною ОСНОВНОГО КЛЮЧА дитини або (НЕ НУЛЬНИХ) УНІКАЛЬНИХ обмежень.


1

Хороший приклад - обробка замовлень. Замовлення від замовника зазвичай має номер замовлення, який ідентифікує замовлення, деякі дані, що виникають один раз за замовлення, такі як дата замовлення та ідентифікатор клієнта, та ряд позицій. Кожна позиція містить номер позиції, який ідентифікує позицію в межах замовлення, замовлений товар, кількість цього продукту, ціну продукту та суму для позиції, яку можна обчислити, помноживши кількість на ціна.

Номер, який ідентифікує позицію, ідентифікує її лише в контексті одного замовлення. Перша позиція в кожному порядку - номер позиції "1". Повна ідентифікація позиції - це номер позиції разом із номером замовлення, частиною якого він є.

Таким чином, взаємовідносини батька між замовленнями та позиціями є ідентифікаційними відносинами. Тісно пов’язана концепція в моделюванні ER походить під назвою "суб'єкт", де позиція - це суб'єкт порядку. Як правило, суб'єкт має обов'язкові відносини дитини та батьків до особи, якій він підпорядковується.

У класичному дизайні бази даних первинним ключем таблиці LineItems буде (OrderNumber, ItemNumber). Деякі із сучасних дизайнерів дають позиції окремий ItemID, який служить первинним ключем і автоматично збільшується СУБД. Я рекомендую в цьому випадку класичний дизайн.


0

Скажімо, у нас є такі таблиці:

user
--------
id
name


comments
------------
comment_id
user_id
text

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


0

Ідентифікуючі відносини між двома сильними сутностями. Неідентифікаційні відносини не завжди можуть бути відносинами між сильною сутністю та слабкою сутністю. Може існувати ситуація, коли сама дитина має первинний ключ, але існування її сутності може залежати від його материнської сутності.

Наприклад: відносини між продавцем і книгою, де продається книга, продавець може існувати там, де продавець може мати власний первинний ключ, але його сутність створюється лише тоді, коли книга продається

Довідка на основі Білла Карвіна


5
Це може допомогти визначити, що ви маєте на увазі під "сильним" та "слабким" утворенням тут.
знесення нанівець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.