Реалізація відношення "один до нуля" або "один" в SQL


11

Скажімо, я розробляю базу даних для сценарію, коли існує взаємозв'язок один до нуля або один (1-0..1). Наприклад:

  • Є набір Користувачів , і деякі Користувачі також можуть бути Клієнтами .

Таким чином, я створив дві відповідні таблиці, usersі customers, але ...

… Який найкращий спосіб представити та реалізувати цю ситуацію на даній платформі SQL? Я розглянув два можливі рішення:

  1. У usersтаблицю додайте customerстовпчик, який може бути або посиланням на ІНТЕРНЕТ-КЛЮЧ, customersабо NULLпозначкою.

  2. У customersтаблиці включіть userстовпчик (встановлений із UNIQUEобмеженням), який вказує на usersтаблицю.

Я вже задавав подібне питання на деяких форумах, але в основному відповідь був "все, що вам потрібно", "все, що ви вважаєте зручним". Мені не подобається така відповідь. Натомість я хочу серйозний фрагмент теорії БД, обґрунтовану відповідь. Де я можу прочитати про стосунки 1-0..1?

Відповіді:


10

Я хочу серйозний фрагмент теорії БД

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

Я думаю, що ваш варіант 2 є найбільш теоретично обґрунтованим, тому що, на відміну від модифікованого варіанту 1, відносини можуть бути у шостій нормальній формі (6NF), будучи нормальною формою проекції та приєднатися до найвищої нормальної форми.

Я також чув про головне правило дизайну, яке говорить про те, що відношення має моделювати ВСЕ сутність або АБО зв’язок між сутностями, але ніколи не обидва, що мені здається розумним. Знову ж, це сприяло б варіанту 2. Однак я чула про це правило ще багато років тому, не пам'ятаю, де і не може запропонувати серйозної теоретичної бази (крім 6NF, як згадувалося вище).


2

Частково вам дали правильну відповідь. Справжня відповідь виходить від вашої моделі даних та того, як вона нормалізувалася. Ключовим моментом є те, як ви налагодите відносини:

  • customersТаблиця складається з декількох полів , що розглядаються в usersтаблиці , які належать до концепції замовника і є недійсними , якщо користувач не є також клієнтом (підтип користувача). У цьому випадку customersтаблиця успадковує первинний ключ від usersтаблиці. (Можна кілька підтипів, які можуть або не перетинаються.)

  • customersТаблиця складається з декількох полів , пов'язаних з концепцією клієнта, але не обов'язково поняття користувача. Замовник - це міцний стіл і не залежить від концепції користувача. (Видалення usersтаблиці не суттєво вплине на дизайн таблиці клієнтів.) У цьому випадку таблиця клієнтів отримує власний первинний ключ.

У вас є особливий випадок необов'язкового відносини між багатьма, де верхня межа 1. Поміркуйте з обох сторін: Чи можливо для одного користувача кілька клієнтів, або один клієнт мати декілька користувачів? Якщо це так, вам потрібно буде переробити свої дані.

Додавання user-idзовнішнього ключа до customersтаблиці можна вважати кращим вибором, оскільки правильно відображає співвідношення один до багатьох (верхня межа 1) і уникає нульового поля. Для забезпечення верхньої межі індекс іноземного ключа повинен бути унікальним. Це відбудеться автоматично, якщо первинним ключем є user-id.

Додавання customer-idяк необов'язковий зовнішній ключ до usersтаблиці примушує верхню межу 1 у співвідношенні, але скасовує залежність.


1

Чи розглядали ви трохи складніший, але гнучкий підхід. Батьківська таблиця - "людина" (або "сутність", залежно від того, наскільки складною ви хочете бути). Тоді таблиця клієнтів та таблиця користувачів мають таблицю FK для особи. Таблиця осіб містить особисті дані, тоді як таблиці клієнтів та користувачів містять лише атрибути, пов’язані з користувачем чи замовником. Часто адреси (електронна пошта та пошта равликів), номери телефонів тощо також представлені в окремих таблицях із таблицями відображення, щоб дозволити багато-багато-багато ситуацій. Це відносно поширена модель, яку ви можете знайти на ряді довідкових сайтів.

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