Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4. СУБД.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
277.66 Кб
Скачать

55

СУБД

  1. Первинні та зовнішні ключі. Принцип побудови зв’язків між таблицями.

Перви́чный ключ (англ. primary key) — в реляционной модели данных один из потенциальных ключей отношения, выбранный в качестве основного ключа (или ключа по умолчанию).

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

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

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

Исторически термин «первичный ключ» появился и стал использоваться существенно ранее термина «потенциальный ключ». Вследствие этого множество определений в реляционной теории были изначально сформулированы с упоминанием первичного (а не потенциального) ключа, например, определения нормальных форм. Также термин «первичный ключ» вошёл в формулировку 12 правил Кодда как основной способ адресации любого значения отношения (таблицы) наряду с именем отношения (таблицы) и именем атрибута (столбца).

 

Зовнішні ключі

 

Зовнішні ключі й цілісність посилань Зовнішній ключ дозволяє описати залежність ключа однієї таблиці від ключа іншої таблиці, а цілісність посилання дозволяє накласти обмеження на операції над таблицями, які мають зовнішній ключ. Наприклад, таблиця score бази даних sampdb має стовпець student_іd, який можна використати для об'єднання даних за результатами з результатами з таблиці student. У базах даних, що підтримують концепцію зовнішніх ключів, стовпець score.student_іd можна назвати зовнішнім ключем. Це дозволить накласти на цей зовнішній ключ у таблиці score наступне обмеження: у таблицю не може бути доданий результат учня, ідентифікатор якого відсутній у таблиці student. (Інакше кажучи, зовнішній ключ не дозволяє вводити оцінки неіснуючих учнів.) Крім того, з'являється можливість видалення каскадного типу, тобто при видаленні учня з таблиці student будуть видалені всі записи з його результатами з таблиці score. Зовнішні ключі є зручними для роботи з базами даних і забезпечують цілісність даних. Без зовнішніх ключів вся відповідальність за відстеженням взаємозв'язків між таблицями і дотримання їхньої цілісності покладається на розробника програмних додатків. У більшості випадків ця робота не вимагає значних витрат, і додає декілька операторів DELETE, щоб при видаленні запису з таблиці видалялися відповідні її записи пов'язаних з нею таблиць. Але якщо між таблицями встановлені досить складні зв'язки, програміст може відмовитись нести відповідальність за відстеження всіх зв'язків у розроблених ним додатках, а покласти ці турботи на систему керування базою даних? Підтримка зовнішніх ключів у СУБД MySQL забезпечується дескриптором таблиць ІnnoDB. В цьому розділі описується, як задаються зовнішні ключі для даного типу таблиць і як вони впливають на використання таблиць. Але спочатку необхідно розібратися з термінами.

  • Початковою є таблиця, що містить оригінальні значення ключів.

  • Створеною є таблиця, яка посилається на ключові значення в початковій таблиці.

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

Формат ІnnoDB забезпечує дотримання всіх цих правил, які дозволяють дотримувати відносини зовнішніх ключів. Це називається цілісністю посилань. Синтаксис опису зовнішнього ключа в створеній таблиці має наступний вигляд, де необов'язкові елементи вказуються у квадратних дужках:

FOREІGN KEY [іndex_name] (іndex_columns) REFERENCES tbl_name (іndex_columns) [ON DELETE actіon] [ON UPDATE actіon] [MATCH FULL | MATCH PARTІAL]

Необхідно відзначити, що, незважаючи на те, що всі частини цього синтаксису аналізуються, формат ІnnoDB не використовує семантику всіх пропозицій. Так, не підтримуються й ігноруються пропозиції ON UPDATE й MATCH (Для таблиць іншого типу всі оголошення FOREІGN KEY ігноруються, але це не є помилкою.). Звертати увагу треба тільки на наступні частини цього оператора.

  • Опція FOREІGN KEY задає стовпці, що складають індекс у створеній таблиці, які повинні відповідати значенню індексу в початковій таблиці. Задане ім'я індексу іndex_name буде проігноровано.

  • Опція REFERENCES повідомляє початкову таблицю і стовпці, що містяться в індексі, які мають відношення до зовнішнього ключа в створеній таблиці. Частина пропозиції іndex_columns повинна мати кількість стовпців, яка рівна кількості стовпців, перерахованих в іndex_columns у пропозиції FOREІGN KEY.

  • Опція ON DELETE дозволяє задавати дії, що виконуються в створеній таблиці при видаленні записів у початковій. Можливі наступні дії.

  • ON DELETE CASCADE дозволяє видаляти записи в створеній таблиці при видаленні відповідних записів у початковій таблиці. У цьому випадку результат видалення передається по каскаду, починаючи від початкової таблиці і закінчуючи створеною. Це дозволяє виконати видалення відразу в декількох таблицях при видаленні рядків тільки з однієї початкової таблиці.

  • ON DELETE SET NULL при видаленні початкового запису, присвоює індексним стовпцям у відповідних початкових записах значення NULL.

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

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

  • Відповідні стовпці в початкових і створених індексах повинні мати порівняльні типи. Наприклад, не можна встановлювати відповідність між стовпцями типу ІNT й CHAR. Відповідні стовпці повинні мати одну довжину. Відповідні цілочисельні стовпці повинні мати однаковий розмір і повинні бути одночасно SІGNED або UNSІGNED..

Зв'язки між таблицями в базі даних Сучасні бази даних зазвичай містять велику кількість взаємозв'язаних таблиць, що дозволяє уникнути повторів. Наприклад, крупні фірми можуть зберігати відомості про магазини в одній таблиці, номенклатуру товарів, отриманих цими магазинами в поточному місяці в іншій таблиці, а відомості про оптових покупців в третій таблиці. Access дозволяє працювати одночасно з декількома таблицями, кожна з яких повинна містити записи, присвячені певній темі. Зв'язок між ними встановлюється по загальних для декількох таблиць полях, наприклад, номера магазинів, через які здійснюється реалізація товару. Бажано, аби в одній з таблиць загальне поле було ключовим. Якщо таблиці взаємозв'язані, то зміни, виконані в записі однієї таблиці, можуть впливати на записі в іншій таблиці.  Для збереження повноти і цілісності даних Access накладає певні обмеження на введення і редагування даних, наприклад, неможливо видалити запис з однієї таблиці, якщо існують пов'язані з нею записи в інших таблицях. 

Вила зв'язків між таблицями Реляційна база даних може містити велику кількість взаємозв'язаних таблиць. Зв'язку встановлюється між двома загальними полями (стовпцями) двох таблиць. Зв'язувані поля можуть мати різні імена, але повинні мати однакового типа даних за винятком випадку, коли поле первинного ключа є полем типа Лічильник. Поле лічильника зв'язується з числовим полем, якщо значення властивості Розмір поля (FieldSize) обоє полів збігаються. Наприклад, якщо властивість обоє полів має значення Довге ціле. Навіть у тому випадку, коли зв'язуються поля типа «Числовою», їх властивості Розмір поля (FieldSize) повинні мати однакові значення.  Задавши зв'язки між таблицями, можна створити запити, форми і звіти для відображення відомостей, представлених в декількох таблицях. Між двома таблицями можуть існувати наступні зв'язки:

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

  •  один до багатьом — в цьому випадку запис однієї таблиці може мати декілька погоджених з нею записів в іншій таблиці. При цьому кожен запис в другій таблиці узгоджується лише з одним записом в першій таблиці. Наприклад, кожен покупець може купити декілька товарів, але кожен проданий товар має лише одного покупця. Поле, що містить первинний ключ нової таблиці, зв'язується із зовнішнім ключем старою. Значення в полі із зовнішнім ключем можуть повторюватися;

  •  багато до одного — будь-якому запису таблиці, зв'язок з якою ми розглядаємо, можуть відповідати декілька записів нової таблиці, але не навпаки. Фактично це відношення один до багатьом, що розглядається, в зворотному порядку. В цьому випадку ключове поле нової таблиці є зовнішнім ключем;

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

Математично такі зв'язки можна записати 1:1, 1:т, т:1 і т:п. Ширшого поширення набули зв'язки один до багатьом, Наприклад, один і той же товар із складу може вивозитися в різні магазини, і одному запису в таблиці Склад відповідатиме декілька записів в таблиці Магазини. Таблиця Склад буде головною таблицею, а Магазини — зв'язаною. У головній таблиці для опису об'єкту використовується один запис. Уникнути дублювання записів в цій таблиці дозволяє первинний ключ.  Дві таблиці зв'язує загальне поле, що дозволяє об'єднати дані з двох таблиць для перегляду, редагування або друку. Записи з таблиць, пов'язаних з поточною таблицею, можна відображувати в підтаблицях в межах основної таблиці.  Зв'язана таблиця — це таблиця, яка зберігається у файлі, що не належить відкритій базі даних, проте, є доступною з Microsoft Access. Користувач має можливість додавати, видаляти і змінювати записи в зв'язаній таблиці, але не може змінювати її структуру. Для забезпечення цілісності даних не можна довільно видаляти або змінювати зв'язані записи. Наприклад, в таблицю Магазини можна включати лише ті записи, які містять відомості про товари, що поступили із складу. 

Використання ключових полів для завдання зв'язку між таблицями В більшості випадків ключове поле однієї таблиці пов'язують із співпадаючим полем (зовнішнім ключем) іншої таблиці. Зовнішній ключ — це одне або декілька полів (стовпців) в таблиці, що містять заслання на поле або поля первинного ключа в іншій таблиці. Поле зовнішнього ключа визначає спосіб скріплення таблиць — вміст поля зовнішнього ключа повинен збігатися з вмістом ключового поля, хоча імена полів можуть при цьому не збігатися. Наприклад, для пов'язання співробітників із замовленнями, за які вони відповідають, слід створити між таблицями «Співробітники» і «Замовлення» зв'язок за допомогою полів «Кодсотрудника». Таблиця «Товари» в демонстраційній базі даних «Борей» містить поле зовнішнього ключа «Кодпоставщика», яке посилається на ключове поле «Кодпоставщика» в таблиці «Постачальники».  Зовнішній ключ може мати значення Null; якщо зовнішній ключ складається з декількох полів, і хоч би одне з них має значення Null, то всі поля повинні мати значення Null.  Для встановлення відношення многие-ко-многим необхідно створити третю (єднальну) таблицю і додати в неї ключові поля з обох таблиць. Наприклад, в демонстраційній базі даних Борей є таблиці Замовлення і Товари. Замовлення може включати декілька товарів, а товар входити в декілька замовлень. Необхідно створити єднальну таблицю (таблиця Замовлено, яка має зв'язок з відношенням «один-ко-многим» з кожною з таблиць Замовлення і Товари. 

Встановлення зв'язку між таблицями Якщо ви хочете ввести нову таблицю у вікно Схема даних (Relationships) (див. мал. 23.21) і встановити зв'язок між таблицями, то виконаєте наступні дії:

  •  закрийте всі таблиці і форми;

  •  у вікні бази даних виберіть команду Схема даних (Relationships) у меню Сервіс (Tools) або натискуйте однойменну кнопку на панелі інструментів;

  •  якщо у вікні Схема даних (Relationships) буде представлена яка-небудь інформація, то натискуйте спочатку кнопку Очистити макет (Clear Layout) а потім кнопку Так (Yes) аби продовжити виконання наміченої операції;

  •  у меню Зв'язки (Relationships) виберіть команду Додати таблицю (Show Table) або натискуйте однойменну кнопку на панелі інструментів;

  •  у діалоговому вікні Додавання таблиці (Show Table) на вкладці Таблиці (Tables) виділите необхідну таблицю і натискуйте кнопку Додати (Add) або двічі клацніть ім'я цієї таблиці (мал. 23.22);

  •  у вікні Схема даних (Relationships) відображуватиметься список полів вибраної таблиці з виділеним полем ключа;

  •  у діалоговому вікні Додавання таблиці (Show Table) виділите таблицю, з якою встановлюється взаємозв'язок і натискуйте кнопку Додати (Add);

  •  у вікні Схема даних (Relationships) перетягнете ключове поле із списку головної таблиці в список зв'язаної таблиці.

Для завдання зв'язку можна перетягнути ім'я поля із списку полий таблиці і помістити його в інший список. При завданні зв'язку «один до багатьом» первинний ключ першої таблиці перетягують в таке ж поле в другій таблиці. 

Зміна зв'язку між таблицями Для зміни зв'язку між таблицями, виберіть в меню Зв'язки (Relationships) команду Змінити зв'язок (Edit Relationship). У діалоговому вікні Зміна зв'язків (Edit Relationship) натискуйте кнопку Нове (Create) аби створити зв'язок (мал. 23.23).

Аби змінити існуючий зв'язок, двічі клацніть її мишею.  Аби зв'язати співпадаючі поля в головній і зв'язаній таблицях, клацніть, порожню верхнє вічко в стовпці Табліца/запрос (Table/Query). У цьому вічку з'явиться кнопка із стрілкою, що відкриває список. Виділите в списку співпадаюче поле. Потім клацніть, порожню верхнє вічко в стовпці Зв'язаною таблица/запрос (Related Table/Query) і виберіть ім'я необхідного поля.  Після того, як зв'язок між таблицями встановлений, їх поля можна об'єднати в запиті, формі або звіті. 

Цілісність даних Аби підтримувати зв'язки між записами в зв'язаних таблицях, і забезпечити захист від випадкового видалення або, зміни зв'язаних даних використовується ряд правив, який забезпечує цілісність даних. Цілісність даних дозволяє запобігти появі незв'язаних записів. Обоє взаємозв'язаної таблиці повинні належати одній базі даних Access.  Зв'язані поля повинні мати одного типа даних. Два виключення зроблено для поля лічильника: воно може бути пов'язане з числовим полем, властивість якого Розмір поля (FieldSize) має значення Довге ціле. Крім того, поле лічильника, властивість Розмір поля (FieldSize) якого має значення Код реплікації, можна пов'язати з числовим полем, якщо властивість Розмір поля (FieldSize) має значення Код реплікації.  Для установки цілісності даних база даних, в якій знаходяться таблиці, має бути відкрита. Для зв'язаних таблиць з баз даних інших форматів встановити цілісність даних неможливо.  Для підтримки цілісності даних в зв'язаних таблицях при оновленні або видаленні запису в головній таблиці, забезпечується каскадне оновлення або видалення всіх зв'язаних записів в підлеглій таблиці або таблицях.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]