якщо деяка деталь тимчасово не поставляється ніяким постачальником. Виходить, що ми не можемо зберігати інформацію про те, що є якийсь постачальник, якщо він не поставляє хоча б одну деталь, і не можемо зберігати інформацію про те, що є деяка деталь, якщо вона ніким не поставляється.
Подібні проблеми виникають тому, що ми змішали в одному відношенні різні об'єкти предметної області - і дані про постачальників, і дані про деталі, і дані про поставки деталей. Говорять, що це відношення погано нормалізовано (просто нормалізованим воно є хоча б тому, що воно є відношення і, отже, автоматично знаходиться в 1НФ).
Про те, як правильно нормалізувати відносини, буде сказано в наступних розділах, зараз же запропонуємо рознести дані по трьох відносинах - "Постачальники", "Деталі", "Поставки". Для нас важливо з'ясувати, яким чином дані, що зберігаються в цих відносинах взаємозв'язані один з одним. Цей зв'язок визначається семантикою предметної області і описується фразами: "Постачальники виконують Поставки", "Деталі поставляються через Поставки". Ці два взаємозв'язки побічно визначають новий взаємозв'язок між "Постачальниками" і "Деталями": "Деталі поставляються Постачальниками".
Ці фрази відображають різні типи взаємозв'язків. Щоб більш точно відобразити предметну область, можна інакше переформулювати фрази: "Один Постачальник може виконувати декілька Поставок", "Одна Деталь може поставлятися декількома Поставками". Це приклад взаємозв'язку типу "один-до-багатьох".
Взаємозв'язок між "Постачальниками" і "Деталями" можна переформулювати так: "Декілька Деталей може поставлятися декількома Постачальниками". Це приклад взаємозв'язку типу "багато-до-багатьох ".
У реляційних базах даних основними є взаємозв'язки типу "один-до-багатьох". Взаємозв'язки типу "багато-до-багатьох" реалізуються використовуванням декількох взаємозв'язків типу "один-до-багатьох". Відношення, що входить в зв'язок із сторони "один" (наприклад, "Постачальники"), називають батьківським відношенням. Відношення, що входить в зв'язок із сторони "багато" (наприклад, "Поставки"), називається дочірньому відношенням.
Механізм реалізації взаємозв'язку "один-до-багатьох" полягає в тому, що в дочірнє відношення додаються атрибути, що є посиланнями на ключові атрибути батьківського відношення. Ці атрибути і є зовнішніми ключами, що визначають, з якими кортежами батьківського відношення пов'язані кортежі дочірнього відношення. Такі атрибути ще називають мігруючими з батьківського відношення.
Таким чином, наш приклад з постачальниками і деталями, що поставляються, повинен виглядати таким чином:
Номер постчальника | Наименование постчальника
1 | Іванов
2 | Петров
3 | Сидоров
Таблиця 6 Відношення "Постачальники"
Номер деталі | Найменування деталі
1 | Болт
2 | Гайка
3 | Гвинт
Таблиця 7 Відношення "Деталі"
Номер постчальника | Номер деталі | Кількість що поставляється
1 | 1 | 100
1 | 2 | 200
1 | 3 | 300
2 | 1 | 150
2 | 2 | 250
3 | 3 | 1000
Таблиця 8 Відношення "Поставки"
Відносно "Поставки" атрибути "Номер постачальника" і "Номер деталі" є посиланнями на ключові атрибути відносин "Постачальники" і "Деталі", і, отже, є зовнішніми ключами. Помітимо, що дані відносини вільні від недоліків, описаних вище, коли всі дані пропонувалося зберігати в одному відношенні. Дійсно, при зміні найменування постачальника або деталі, ця зміна відбувається тільки в одному місці. Якщо постачальник припинив поставки всіх деталей, то віддаляються відповідні кортежі відносно "Поставки", дані ж про самого постачальника залишаються без змін.
Дамо точне визначення.
Визначення 2. Хай дано відношення . Підмножина атрибутів відносини називатимемо зовнішнім ключем, якщо:
Існує відношення ( і не обов'язково різні) з потенційним ключем .
Кожне значення у відношенні завжди співпадає із значенням для деякого кортежу з , або є null-значенням.
Відношення називається батьківським відношенням, відношення називається дочірнім відношенням.
Зауваження. Зовнішній ключ, також як і потенційний, може бути простим і складовим.
Зауваження. Зовнішній ключ повинен бути визначений на тих же доменах, що і відповідний первинний ключ батьківського відношення.
Зауваження. Зовнішній ключ, як правило, не володіє властивістю унікальності. Так і повинно бути, оскільки в дочірньому відношенні може бути декілька кортежів, що посилаються на один і той же кортеж батьківського відношення. Це, власне, і дає тип відношення "один-до-багатьох".
Зауваження. Якщо зовнішній ключ все-таки володіє властивістю унікальності, то зв'язок між відносинами має тип "один-до-одного". Частіше за все такі відносини об'єднуються в одне відношення, хоча це і не обов'язково.
Зауваження. Хоча кожне значення зовнішнього ключа зобов'язано співпадати із значеннями потенційного ключа в деякому кортежі батьківського відношення, те зворотне, взагалі кажучи, невірне. Наприклад, можуть існувати постачальники, що не поставляють ніяких деталей.
Зауваження. Для зовнішнього ключа не вимагається, щоб він був компонентом деякого потенційного ключа (як вийшло в прикладі з постачальниками і деталями).
Зауваження. Null-значення для атрибутів зовнішнього ключа допустимі тільки у тому випадку, коли атрибути зовнішнього ключа не входять до складу ніякого потенційного ключа
Цілісність зовнішніх ключів
Оскільки зовнішні ключі фактично служать посиланнями на кортежі в іншому (або в тому ж самому) відношенні, то ці посилання не повинні указувати на неіснуючі об'єкти. Це визначає наступне правило цілісності зовнішніх ключів:
Правило цілісності зовнішніх ключів. Зовнішні ключі не повинні бути неузгоджено, тобто для кожного значення зовнішнього ключа повинне існувати відповідне значення первинного ключа в батьківському відношенні.
Зауваження до правил цілісності сутностей і зовнішніх ключів
Насправді приведені правила цілісності сутностей і зовнішніх ключів прямо виходять з визначень понять "потенційний ключ" і "зовнішній ключ".
Дійсно, у визначенні потенційного ключа вимагається, щоб потенційний ключ володів властивістю унікальності. Це фактично означає, що ми повинні уміти розрізняти значення потенційних ключів, тобто при порівнянні двох значень потенційного ключа ми завжди повинні набувати значення або ІСТИНА, або БРЕХНЯ. Але будь-яке порівняння, в яке входить null-значення, приймає значення U - НЕВІДОМО, звідки витікає, що атрибути потенційного ключа не можуть містити null-значень.
Для зовнішніх ключів правило цілісності фактично входить у визначення (п. 2 визначення 2).
Таким