Мета: розкрити особливості додавання інформації в реляційну базу даних, не порушуючи цілісності сутностей, посилальної цілісності та корпоративні обмеження цілісності.
Розробник баз даних повинен розуміти послідовність заповнення таблиць інформацією до створення фізичної моделі реляційної бази даних. Строго кажучи, вона збігається з порядком створення таблиць БД. Дотримуйтесь цього правилу і не будете помилятися. Але не забувайте, що чим складніше БД, тим більше варіантів послідовностей створення і заповнення таблиць інформацією. Вам потрібно буде вибрати оптимальний варіант для цього.
На етапі фізичного моделювання реляційної бази даних визначаються механізми цілісності сутностей, посилальної цілісності і корпоративні обмеження цілісності. Вони накладають ряд необхідних обмежень на введення, коригування та видалення інформації з таблиць БД. Ці обмеження визначають послідовність заповнення таблиць. Якщо все зроблено правильно, то у користувачів не буде ніяких шансів обійти ці механізми.
Заповнення інформацією навчальної БД «БІБЛІОТЕКА» є необхідним етапом навчання. Порядок введення інформації в її таблиці збігається з послідовністю їх створення. Такий підхід дозволить без помилок ввести інформацію в БД навіть при відсутності ряду необхідних обмежень. Їх Вам буде запропоновано додати самостійно на практичних заняттях.
Введення інформації у таблицю PhoneTypes обмежено цілісністю сутностей та корпоративними обмеженнями цілісності. За цілісність сутності відповідає первинний ключ Code. Він був визначений в однойменному стовпці Code. Корпоративні обмеження цілісності забезпечуються доменами AllCode і AllNameType (див. таблицю PhoneTypes у фізичній моделі «БІБЛІОТЕКА»).
Фізичне моделювання бази даних почнемо з опису двох типів механізмів, що забезпечують унікальні значення первинних ключів. Перший тип більш поширений і зрозумілий. Він задає автоінкремент для ключового стовпця типу INTEGER в операторі CREATE TABLE. В СУБД Interbase реалізований другий тип. Він визначає унікальне значення ключа за допомогою генератора. Його необхідно створити за допомогою оператора CREATE GENERATOR. Ми це зробили для первинного ключа таблиці PhoneTypes:
CREATE GENERATOR PhoneTypesCode;
Тепер необхідно задати його початкове значення. В СУБД Interbase для цього використовується оператор SET GENERATOR. Генератори зазвичай встановлюються на початкове значення, яка дорівнює нулю. Оператор, який визначає початкове значення для генератора PhoneTypesCode, виглядає так:
Обидва механізми генерують унікальне значення первинного ключа в операторі INSERT, коли він додає новий рядок в таблицю. Механізм автоінкремента не вимагає наявності ключового стовпця для додавання нового рядка. Механізм генераторів вимагає використання функції GEN_ID() в кожному операторі INSERT для ключового стовпця.
Функція GEN_ID() задає крок зміни значення генератора. Крок можна міняти для кожного нового рядка, якщо це необхідно. Нижче наведені оператори INSERT з функцією GEN_ID() для додавання інформації в таблицю PhoneTypes:
INSERT TABLE PhoneTypes
(Code, Name)
VALUES
(GEN_ID(PhoneTypesCode, 1), 'Домашній');
INSERT TABLE PhoneTypes
(Code, Name)
VALUES
(GEN_ID(PhoneTypesCode, 1), 'Робочий');
INSERT TABLE PhoneTypes
(Code, Name)
VALUES
(GEN_ID(PhoneTypesCode, 1), 'Мобільний');
INSERT TABLE PhoneTypes
(Code, Name)
VALUES
(GEN_ID(PhoneTypesCode, 1), 'Супутниковий');
В результаті послідовної роботи чотирьох операторів INSERT в таблицю PhoneTypes було додано чотири рядки (Додаток Г). Щоразу функція GEN_ID() задавала крок збільшення значення Code на 1. Для цього використовувався генератор PhoneTypesCode. Для нього початкове значення дорівнювало 0. Тому значення в стовпці Code у першому рядку таблиці PhoneTypes дорівнює 1 (табл. В.1).
Таблиця В.1
Code | Name |
---|---|
1 | Домашній |
2 | Робочий |
3 | Мобільний |
4 | Супутниковий |
Додавання інформації в таблицю PassportData має наступні особливості. В операторі CREATE TABLE для цієї таблиці не визначений первинний ключ по стовпцю Code. Однак, для цілісності сутності «Паспорт» і посилальної цілісності БД «БІБЛІОТЕКА» необхідно забезпечити унікальність значень в цьому стовпці. Для цього створимо генератор PassportDataCode:
CREATE GENERATOR PassportDataCode;
SET GENERATOR PassportDataCode TO
Принцип дії генераторів ми розглянули раніше. Корпоративні обмеження цілісності в таблиці PassportData були описані в фізичної моделі бази даних «БІБЛІОТЕКА». Нижче наведено приклад операторів INSERT, які додають перші два рядки в таблицю PassportData.
INSERT TABLE PassportData
(Code, Series, Number, Birthday, BirthPlace, Sex, IssuePlace, IssueDate)
VALUES
(GEN_ID(PassportDataCode, 1), 'АА', 45003, '05/30/1930', 'Росія, г.Опочки', 'Ж', 'Дніпропетровськ', '01/12/1995');
INSERT TABLE PassportData
(Code, Series, Number, Birthday, BirthPlace, Sex, IssuePlace, IssueDate)
VALUES
(GEN_ID(PassportDataCode, 1), 'АА', 15700, '02/23/1930', 'Росія. м.Володимир', 'Ж', 'Житомир', '03/16/2000');
Всього у таблицю PasportData введено 24 рядки (Додаток Г). Вся інформація, яка була додана, наведена в таблиці В.2.
Таблиця В.2
Code | Series | Number | Birthday | Birthplace | Sex | Issueplace | Issuedate | Note |
---|---|---|---|---|---|---|---|---|
1 | АА | 45003 | 30.05.1930 | Росія, м. Опочки | Ж | Дніпропетровськ | 12.01.1995 | NULL |
2 | АА | 15700 | 23.02.1930 | Росія. м. Володимир | Ж | Житомир | 16.03.2000 | NULL |
3 | АБ | 87134 | 20.01.1963 | Дніпропетровська область, село Солоне | Ж | Дніпропетровська область, село Солоне | 10.01.1998 | NULL |
4 | АЕ | 12300 | 12.11.1960 | Україна, м. Донецьк | Ч | Донецьк | 15.12.1991 | NULL |
5 | АЕ | 1067 | 19.07.1981 | Україна, Дніпропетровськ | Ч | Дніпропетровськ | 25.08.1997 | NULL |
6 | АЖ | 1568 | 14.09.1956 | Казахстан, місто Павлодар | Ч | Київ | 24.05.1999 | NULL |
7 | АЗ | 43188 | 13.11.1970 | Дніпропетровська область, м. Дніпродзержинськ | Ж | Дніпропетровська область, м. Дніпродзержинськ | 15.05.1998 | NULL |
8 | АК | 23490 | 05.01.1961 | Росія, місто Самара | Ж | Дніпропетровськ | 13.09.2000 | NULL |
9 | АС | 90843 | 10.10.1949 | Молдова, місто Кишинів | Ж | Дніпропетровськ | 13.12.1998 | NULL |
10 | АЯ | 90764 | 14.11.1950 | Україна, місто Миколаїв | Ж | м. Миколаїв | 11.11.1998 | NULL |
11 | ІК | 10842 | 19.07.1949 | Україна, м. Кіровоград | Ч | Дніпропетровськ | 06.01.1998 | NULL |
12 | ІК | 45190 | 18.07.1983 | Дніпропетровська область, село Петропавлівка | Ж | Дніпропетровська область, село Петропавлівка | 20.09.1999 | NULL |
13 | АН | 61327 | 01.10.1960 | Росія, Санкт-Пітербург | Ж | Санкт-Пітербург | 12.10.1976 | NULL |
14 | АН | 64277 | 23.12.1972 | Україна, м. Львів | Ч | Львів | 06.01.1988 | NULL |
15 | АК | 89125 | 07.05.1980 | Україна, м. Київ | Ч | Київ | 10.01.1998 | NULL |
16 | АК | 55706 | 07.04.1965 | Донецьк | Ж | Донецьк | 20.04.1982 | NULL |
17 | АС | 73271 | 05.07.1950 | Крим | Ч | Сімферополь | 23.08.1970 | NULL |
18 | АЖ | 45879 | 04.02.1961 | Дніпропетровськ | Ж | Дніпродзержинськ | 14.03.1980 | NULL |
19 | АС | 12548 | 08.04.1974 | Трускавець | Ж | Прикарпаття | 28.05.1989 | NULL |
20 | АК | 12578 | 11.11.1987 | Донецьк, Краматорськ | Ж | Київ | 26.01.2000 | NULL |
21 | АС | 55489 | 25.09.1981 | Суми | Ж | Харків | 06.11.1999 | NULL |
22 | АЯ | 45789 | 07.08.1972 | Угорщина | Ж | Івано-Франківськ | 03.10.1988 | NULL |
23 | АЖ | 35126 | 18.03.1975 | Одеса | Ж | Одеса | 19.06.1993 | NULL |
24 | АН | 15625 | 19.06.1966 | Дніпропетровськ | Ч | Дніпропетровськ, Петриківка | 12.08.1982 | NULL |
У таблиці Librarians цілісність сутності забезпечує первинний ключ по стовпцю Code. За унікальність його значень відповідає генератор LibrariansCode.
CREATE GENERATOR LibrariansCode;
SET GENERATOR LibrariansCode TO
Робота генераторів описана для таблиці PhoneTypes. Корпоративні обмеження цілісності таблиці Librarians забезпечуються доменами. Їх повний список наведено у фізичної моделі БД «БІБЛІОТЕКА» (Додаток Б).
Механізми посилальної цілісності для таблиці Librarians не реалізовані. Це зроблено спеціально. Не забувайте, що БД «БІБЛІОТЕКА» призначена для навчання. Якщо Ви вважаєте себе фахівцем, то спробуйте дописати їх в script-файл самостійно. Почніть з зовнішніх ключів. Але, найбільш корисно це буде зробити, використовуючи тригера і процедури. Залишилося додати, що в script-файлі реалізовані подібні механізми для таблиці, яка дуже схожа на таблицю Librarians. Спробуйте відповісти на питання: яка це таблиця?
Нижче наведені оператори INSERT для додавання перших двох рядків в таблицю Librarians.
INSERT TABLE Librarians
(Code, ClockNumber, FamilyName, Name, Patronymic, PassportCode, Post, HomePhone)
VALUES
(GEN_ID(LibrariansCode, 1), 28, 'Іванова', 'Олена', 'Володимирівна', 2, 'Бібліотекар', '52‑XX‑75');
INSERT TABLE Librarians
(Code, ClockNumber, FamilyName, Name, Patronymic, PassportCode, Post, HomePhone)
VALUES
(GEN_ID(LibrariansCode, 1), 12, 'Ніколаєнко', 'Любов', 'Миколаївна', 10, 'Бібліотекар', '46‑XX‑19');
Всього в таблицю Librarians додано 12 рядків (Додаток Г). Вони наведені нижче в таблиці В.3.
Таблиця В.3
Code | ClockNumber | FamilyName | Name | Patronymic | PasportCode | Post | HomePhone | Note |
---|---|---|---|---|---|---|---|---|
1 | 28 | Іванова | Олена | Володимирівна | 2 | Бібліотекар | 52-XX-75 | NULL |
2 | 12 | Ніколаєнко | Любов | Миколаївна | 10 | Бібліотекар | 46-XX-19 | NULL |
3 | 187 | Іноземцева | Іванна | Модестівна | 9 | Ст. бібліотекар | 775-XX-00 | NULL |
4 | 83 | Мальцева | Діана | Петрівна | 12 | Бібліотекар | 29-XX-15 | NULL |
5 | 10 | Сизранцева | Тетяна | Ігорівна | 3 | Бібліотекар | 370-XX-22 | NULL |
6 | 100 | Ставка | Лілія | Іванівна | 7 | Бібліотекар | 22-XX-01 | NULL |
7 | 50 | Лещенко | Алла | Федорівна | 13 | Бібліотекар | 722-XX-36 | NULL |
8 | 36 | Сіра | Лідія | Іванівна | 19 | Бібліотекар | 254-XX-02 | NULL |
9 | 45 | Прохіна | Тамара | Львівна | 21 | Бібліотекар | 63-XX-01 | NULL |
10 | 78 | Самойленко | Вікторія | Ігорівна | 20 | Бібліотекар | 125-XX-80 | NULL |
11 | 69 | Степанова | Олександра | Миколаївна | 16 | Ст. бібліотекар | 445-XX-65 | NULL |
12 | 17 | Петрова | Аліна | Сергіївна | 23 | Бібліотекар | 999-XX-05 | NULL |
У навчальній БД «БІБЛІОТЕКА» таблиця Readers має найбільш багатий набір інструментів для маніпулювання даними (Додаток Г). Вона є основою більш складної структурної одиниці - довідника «Читачі». Раніше це поняття не з’являлося.
Наддамо загальне визначення. Довідник – це одна або множина таблиць, що отримані в результаті нормалізації вихідного відношення. Тоді довідник «Читачі» – це множина таблиць, які отримані в результаті нормалізації вихідного відношення «ЧИТАЧІ» (Лекція «Нормалізація відношень», рис. 3.1).
Структуру довідника «Читачі» наочно видно на діаграмі зв'язків між відношеннями БД «БІБЛІОТЕКА». До нього увійшли таблиці, які побудовані на базі наступних відношень: «ЧИТАЧІ», «ПАСПОРТНІ ДАНІ», «ТЕЛЕФОНИ» і «ТИПИ ТЕЛЕФОНІВ». Далі ми будемо вести мову тільки про таблицю Readers («ЧИТАЧІ»).
Стовпець Code не визначений як первинний ключ таблиці Readers. Але цілісність сутності в ній і посилальна цілісність БД «БІБЛІОТЕКА» забезпечується унікальністю значень в цьому стовпці. За це відповідає генератор ReadersCode:
CREATE GENERATOR ReadersCode;
SET GENERATOR ReadersCode TO
Робота механізму генераторів описана вище. Він використовується в операторах INSERT для додавання нових рядків у таблицю Readers. Приклад операторів для додавання перших двох рядків таблиці наведено нижче:
INSERT TABLE Readers
(Code, FamilyName, Name, Patronymic, ReaderCardNumber, PassportCode, Job, Post)
VALUES
(GEN_ID(ReadersCode, 1), 'Іванов', 'Петро', 'Іванович', 317, 4, 'НГУ, каф.ЕОТ', 'Асистент');
INSERT TABLE Readers
(Code, FamilyName, Name, Patronymic, ReaderCardNumber, PassportCode, Job, Post)
VALUES
(GEN_ID(ReadersCode, 1), 'Федорец', 'Ірина', 'Олегівна', 28, 1, 'НГУ, АХЧ', 'Вахтер');
Всього в таблицю Readers додано 12 рядків (Додаток Г). Ви можете їх побачити в таблиці В.4.
Таблиця В.4
Code | FamilyName | Name | Patronymic | ReaderCardNumber | PasportCode | Job | Post | Note |
---|---|---|---|---|---|---|---|---|
1 | Іванов | Петро | Іванович | 317 | 4 | НГУ, каф. ЕОТ | Асистент | NULL |
2 | Федорец | Ірина | Олегівна | 28 | 1 | НГУ, АХЧ | Вахтер | NULL |
3 | Ільїн | Іван | Петрович | 1345 | 11 | НГУ, каф. фізики | Доцент | NULL |
4 | Суренко | Дмитро | Павлович | 543 | 6 | НГУ, каф. геофізики | Ст. викладач | NULL |
5 | Коршунова | Наталя | Юріївна | 128 | 8 | НГУ, каф. геоіформатики | Асистент | NULL |
6 | Носенко | Олег | Володимирович | 5672 | 5 | НГУ, ІКК | Інженер | NULL |
7 | Брусов | Володимир | Михайлович | 485 | 24 | НГУ, каф. геодезії | Лаборант | NULL |
8 | Козирєв | Олексій | Сергійович | 759 | 15 | НГУ, каф. кримінології | Професор | NULL |
9 | Левченко | Юлія | Павлівна | 146 | 18 | НГУ, каф. політичної теорії | Завідувач кафедри | NULL |
10 | Світла | Тетяна | Іванівна | 2021 | 22 | НГУ, каф. перекладу | Ст. викладач | NULL |
11 | Щиглів | Петро | Євгенович | 997 | 14 | НГУ, каф. електропостачання | Асистент | NULL |
12 | Кириленко | Віктор | Олександрович | 1010 | 17 | НГУ, каф. електроприводу | Заступник декана | NULL |
Таблиця Phones має істотну відмінність від усіх таблиць, які були розглянуті раніше. На етапі логічного моделювання для неї був визначений складений потенційний ключ. Унікальність значень складеного потенційного ключа забезпечує цілісність сутності в таблиці Phones. Це номер телефону читача (Додаток А).
Механізм генераторів не підходить для підтримки унікальності значень складених потенційних або первинних ключів. Замість нього тут працює механізм тригерів (Додаток Г). Тому Ви не побачите функцій GEN_ID() в операторах INSERT для додавання нових рядків у таблицю Phones. Дивіться нижче додавання перших двох рядків:
INSERT TABLE Phones
(ReaderCode, PhoneTypesCode, PhoneNumber)
VALUES
(1, 1, '29-XX-15');
INSERT TABLE Phones
(ReaderCode, PhoneTypesCode, PhoneNumber)
VALUES
(1, 2, '98-XX-88');
Всього в Phones додано 25 рядків (Додаток Г). Вони наведені нижче в таблиці В.5.
Таблиця В.5
ReaderCode | PhoneTypeCode | PhoneNumber |
---|---|---|
1 | 1 | 29-XX-15 |
1 | 2 | 98-XX-88 |
1 | 3 | 38053198XX87 |
2 | 2 | 47-XX-10 |
3 | 1 | 68-XX-09 |
4 | 1 | 370-XX-20 |
4 | 3 | 38097567XX54 |
5 | 1 | 744-XX-00 |
6 | 1 | 33-XX-35 |
6 | 3 | 38096231XX83 |
8 | 1 | 68-XX-58 |
8 | 2 | 47-XX-45 |
8 | 3 | 38063257XX88 |
9 | 1 | 144-XX-48 |
9 | 2 | 32-XX-02 |
9 | 3 | 38097555XX22 |
10 | 1 | 56-XX-01 |
10 | 2 | 89-XX-98 |
10 | 3 | 38053456XX52 |
11 | 1 | 789-XX-97 |
11 | 2 | 47-XX-96 |
11 | 3 | 38054022XX84 |
12 | 1 | 777-XX-45 |
12 | 2 | 41-XX-39 |
12 | 3 | 38067454XX21 |
У таблиці Books цілісність сутності підтримується первинним ключем по стовпцю Code. Він також відповідає за посилальну цілісність БД «БІБЛІТЕКА» За унікальність значень в стовпці Code відповідає генератор BooksCode:
CREATE GENERATOR BooksCode;
SET GENERATOR BooksCode TO
Робота генераторів описана на прикладі таблиці PhoneTypes. Нижче наведені оператори INSERT для додавання перших двох строк в таблицю Books.
INSERT TABLE Books
(Code, Name, IssueYear, Drawing, BookPublishers, UDK, Cipher)
VALUES
(GEN_ID(BooksCode, 1), 'Автоматизація виробничих процесів на збагачувальній фабриці', '01/01/1985', 60000, «Надра», '622.7', '622.7‑52 ⁄Т');
INSERT TABLE Books
(Code, Name, IssueYear, Drawing, BookPublishers, UDK, Cipher)
VALUES
(GEN_ID(BooksCode, 1), 'Розв'язання завдань по автоматизації процесів збагачення й металургії', '01/01/1969', 200000, «Наука», '622.7‑52', '622.7‑52(075) ⁄Т');
У script-файлі в таблицю Books додано 14 рядків за допомогою операторів INSERT (Додаток Г). Результат їхньої роботи дивіться нижче (таблиця В.6).
Таблиця В.6
Code | Name | IssueYear | Drawing | BookPublishers | UDK | Cipher | Note |
---|---|---|---|---|---|---|---|
1 | Автоматизація виробничих процесів на збагачувальній фабриці | 01.01.1985 | 6000 | «Надра» | NULL | 622.7-52/Т | NULL |
2 | Розв'язання завдань по автоматизації процесів збагачення й металургії | 01.01.1969 | 2000 | «Наука» | NULL | 622.7-52(075)/Т | NULL |
3 | Асимптотичні методи оптимального керування | 01.01.1987 | 1000 | «Автомат» | NULL | 681.513.5:/А | NULL |
4 | Синтез оптимальних автоматичних систем | 01.31.1984 | 5000 | «Автомат» | NULL | 681.513.5:/ДО | NULL |
5 | Методи оптимізації стохастичних систем | 01.01.1987 | 4500 | «Матстат» | NULL | 681.513.5:/ДО | NULL |
6 | Автоматизовані системи керування технологічним процесом збагачення руди | 31.01.1987 | 4000 | «Автомат» | NULL | 622.7-52/П | NULL |
7 | C/C++ Програмування мовою високого рівня | 11.01.2007 | 5500 | «Пітер» | NULL | 681.3.06(075) | NULL |
8 | Комп'ютерні мережі. Принципи, технології, протоколи | 31.01.2006 | 6000 | «Пітер» | NULL | 004.72(075) | NULL |
9 | Довідник по диференціальних рівняннях з приватними похідними першого порядку | 31.01.2003 | 10000 | «ФИЗМАТЛІТ» | NULL | 517.9 | NULL |
10 | Теорія ймовірностей й математична статистика | 31.01.2004 | 1000 | «Пітер» | NULL | 519.2 | NULL |
11 | C#. Програмування мовою високого рівня | 31.01.2009 | 1500 | «Пітер» | NULL | 004.43 | NULL |
12 | Теорія імовірностей й математична статистика | 31.01.2005 | 2000 | «Вища школа» | NULL | 519.2 | NULL |
13 | Теорія імовірностей й математична статистика | 31.01.2002 | 2500 | «ФИЗМАТЛІТ» | NULL | 519.2 | NULL |
14 | Дискретно-групові методи інтегрування звичайних диференціальних рівнянь | 31.01.1991 | 7000 | «ЛІІАН» | NULL | 517.9-37 | NULL |
Первинний ключ по стовпцю Code відповідає за цілісність сутності в таблиці BookAuthors і за посилальну цілісність БД «БІБЛІОТЕКА». Унікальність значень первинного ключа підтримує генератор BookAuthorsCode:
CREATE GENERATOR BookAuthorsCode;
SET GENERATOR BookAuthorsCode TO
Робота механізму генераторів описана на прикладі таблиці PhoneTypes. Нижче наведені оператори INSERT, які додають перші два рядки в таблицю BookAuthors:
INSERT TABLE BookAuthors
(Code, FamilyName, Name, Patronymic, Birthday)
VALUES
(GEN_ID(BookAuthorsCode, 1), 'Тіхонов', 'Олег', 'Миколайович', '01/31/1940');
INSERT TABLE BookAuthors
(Code, FamilyName, Name, Patronymic, Birthday)
VALUES
(GEN_ID(BookAuthorsCode, 1), 'Акуленко', 'Леонід', 'Дмитрович', '03/12/1934');
Таблиця BookAuthors містить 16 рядків. Усі вони сформовані в script-файлі операторами INSERT (Додаток Г). Результати їх роботи наведені в таблиці В.7.
Таблиця В.7
Code | FamilyName | Name | Patronymic | Birthday | DeatheDay | ShortBiography | Note |
---|---|---|---|---|---|---|---|
1 | Тіхонов | Олег | Миколайович | 12.07.1945 | NULL | NULL | NULL |
2 | Акуленко | Леонід | Дмитрович | 26.11.1962 | NULL | NULL | NULL |
3 | Процуто | Віктор | Сергійович | 14.08.1950 | NULL | NULL | NULL |
4 | Колосов | Геннадій | Євгенович | 01.06.1950 | NULL | NULL | NULL |
5 | Козаков | Ігор | Єлисейович | 18.09.1962 | NULL | NULL | NULL |
6 | Павловська | Тетяна | Олександрівна | 03.08.1967 | NULL | NULL | NULL |
7 | Зайцев | Валентин | Федорович | 03.07.1955 | NULL | NULL | NULL |
8 | Полянин | Андрій | Дмитрович | 15.03.1939 | NULL | NULL | NULL |
9 | Андронов | Олександр | Михайлович | 18.06.1969 | NULL | NULL | NULL |
10 | Копитов | Євген | Олександрович | 09.03.1950 | NULL | NULL | NULL |
11 | Гринглаз | Леонід | Якович | 11.07.1950 | NULL | NULL | NULL |
12 | Баврін | Іван | Іванович | 12.09.1949 | NULL | NULL | NULL |
13 | Пугачов | Володимир | Семенович | 03.02.1958 | NULL | NULL | NULL |
14 | Оліфер | Віктор | Григорович | 07.04.1961 | NULL | NULL | NULL |
15 | Оліфер | Наталя | Олексіївна | 11.12.1965 | NULL | NULL | NULL |
16 | Флегонтов | Олександр | Володимирович | 07.07.1963 | NULL | NULL | NULL |
У фізичної моделі БД «БІБЛІОТЕКА» визначено складений первинний ключ для таблиці CoAuthorship. До його складу входять всі її стовпці. Ви вже знаєте, що генератори не підходять для підтримки унікальності значень складених потенційних або первинних ключів. Для цього необхідно використовувати тригери та процедури.
У script-файлі не прописані тригери і процедури для забезпечення унікальних значень потенційного ключа таблиці CoAuthorship. Такий підхід можливий. Він базується на внутрішніх механізмах СУБД. Вони генерують виняткову ситуацію при спробі введення неунікального значення для первинного ключа. Нижче наведені оператори INSERT для додавання трьох перших рядків у таблицю CoAuthorship.
INSERT TABLE CoAuthorship
(BookCode, AuthorCode)
VALUES
(1, 1);
INSERT TABLE CoAuthorship
(BookCode, AuthorCode)
VALUES
(2, 1);
INSERT TABLE CoAuthorship
(BookCode, AuthorCode)
VALUES
(3, 2);
Послідовність додавання інформацію в таблицю CoAuthorship має значення. Розглянемо її на прикладі третього рядка. У ньому значення зовнішніх ключів BookCode та AuthorCode відповідно дорівнюють 3 і 2. Це означає, що в таблиці Books повинний бути рядок зі значенням первинного ключа Code, що дорівнює 3. Додатково в таблиці BookAuthors повинний бути рядок зі значенням первинного ключа Code, що дорівнює 2. Інакше правила посилальної цілісності БД «БІБЛІОТЕКА» згенерують виняткову ситуацію, використовуючи стандартні механізми СУБД Interbase. В цьому випадку третій рядок не буде доданий у таблицю CoAuthorship.
Всього у script-файлі додається 19 рядків в таблицю CoAuthorship (Додаток Г). Для додавання кожного рядка створений окремий оператор INSERT. Результати їх роботи Ви можете бачити в таблиці В.8.
Таблиця В.8
BookCode | AuthorCode |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 4 |
5 | 5 |
6 | 3 |
7 | 6 |
8 | 14 |
8 | 15 |
9 | 7 |
9 | 8 |
10 | 9 |
10 | 10 |
10 | 11 |
11 | 6 |
12 | 12 |
13 | 13 |
14 | 16 |
14 | 7 |
Цілісність сутності в таблиці BookFunds забезпечується унікальністю значень у стовпці Code. Він обраний в якості первинного ключа. Генератор BookFundsCode забезпечує унікальні ключові значення:
CREATE GENERATOR BookFundsCode;
SET GENERATOR BookFundsCode TO
Принцип роботи генераторів описаний вище. Нижче наведені оператори INSERT, які додають два рядки в таблицю BookFundsCode:
У таблиці BookFundsCode всього два рядки. Тому можете бачити усі оператори INSERT зі script-файлу, які додають в неї інформацію. Результати їх роботи наведені у таблиці В.9.
Таблиця В.9
Code | Name |
---|---|
1 | НТБ |
2 | Студентський |
У таблиці BookInventoryNumbers цілісність сутності забезпечується первинним ключем по стовпцю Code. Генератор BookInventoryNumbersCode створює унікальні значень для цього первинного ключа:
CREATE GENERATOR BookInventoryNumbersCode;
SET GENERATOR BookInventoryNumbersCode TO
Механізм роботи генераторів описаний вище. Залишилося навести приклад операторів INSERT, які вводять перші два рядки в таблицю BookInventoryNumbers:
INSERT TABLE BookInventoryNumbers
(Code, BookCode, FundCode, InventoryNumber, Cost)
VALUES
(GEN_ID(BookFundsCode, 1), 1, 1, 4567890, 15.56);
INSERT TABLE BookInventoryNumbers
(Code, BookCode, FundCode, InventoryNumber, Cost)
VALUES
(GEN_ID(BookFundsCode, 1), 2, 1, 4510000, 22.33);
Розглянемо послідовність додавання інформації у другий рядок таблиці BookInventoryNumbers. Тут важливі значення зовнішніх ключів: BookCode = 2 і FundCode = 1. Без відповідних рядків в таблицях Books і BookFunds ми не зможемо ввести другий рядок в таблицю BookInventoryNumbers.
В обох таблицях первинний ключ визначений на стовпці Code. На них посилаються зовнішні ключі таблиці BookInventoryNumbers. Отже, спочатку необхідно додати рядок в таблицю Books, в якій значення Code = 2, а потім додати рядок в таблицю FundCode, де Code = 1. Тепер Ви зможете додати другий рядок у таблицю BookInventoryNumbers.
Усього в script-файлі додається 15 рядків в таблицю BookInventoryNumbers. Для додавання кожного рядка створений окремий оператор INSERT (Додаток Г). Результати їх роботи Ви можете бачити в таблиці В.10.
Таблиця В.10
Code | BookCode | FundCode | InventoryNumber | Cost |
---|---|---|---|---|
1 | 1 | 1 | 4567890 | 15,56 |
2 | 2 | 1 | 4510000 | 22,33 |
3 | 3 | 1 | 4532477 | 34,01 |
4 | 4 | 1 | 4512890 | 12,99 |
5 | 5 | 2 | 4678532 | 56,78 |
6 | 6 | 2 | 4632112 | 10,10 |
7 | 7 | 2 | 7569832 | 73,50 |
8 | 7 | 2 | 5478956 | 45,10 |
9 | 8 | 2 | 2145876 | 59,25 |
10 | 9 | 1 | 5214786 | 36,05 |
11 | 10 | 1 | 5268933 | 74,20 |
12 | 11 | 2 | 7865890 | 21,32 |
13 | 12 | 1 | 6589321 | 36,69 |
14 | 13 | 1 | 7812639 | 48,13 |
15 | 14 | 1 | 7523690 | 27,99 |
У таблиці BookGiveOutRecord необхідно підтримувати цілісність сутності «Інвентарний номер книги». За це відповідає первинний ключ Code. Унікальність його значень забезпечує генератор BookGiveOutRecordCode:
CREATE GENERATOR BookGiveOutRecordCode;
SET GENERATOR BookGiveOutRecordCode TO
Принципи роботи генераторів описані раніше для таблиці PhoneTypes. Нижче наведені оператори INSERT, які додають перші два рядки у таблицю BookGiveOutRecord:
INSERT TABLE BookGiveOutRecord
(Code, ReaderCode, OutLibrarianCode, InventoryCode, IssueDate, ReturnDate, FactReturnDate, InLibrarianCode)
VALUES
(GEN_ID(BookGiveOutRecordCode, 1), 2, 4, 6, '09/11/2004', '09/25/2004', '09/24/2004', 3);
INSERT TABLE BookGiveOutRecord
(Code, ReaderCode, OutLibrarianCode, InventoryCode, IssueDate, ReturnDate, FactReturnDate, InLibrarianCode)
VALUES
(GEN_ID(BookGiveOutRecordCode, 1), 3, 4, 4, '09/02/2004', '09/16/2004', '12/11/2004', 3);
У таблицю BookGiveOutRecord інформація була додана в останню чергу. Спробуйте оцінити масштаби підготовки до її вводу. Для того, щоб зафіксувати 10 випадків видачі книг читачам було введено 10 рядків в таблицю BookGiveOutRecord. Перед цим було додано 143 рядки у 10 таблиць.
На прикладі першого рядка розберемося з послідовністю додавання інформації в таблицю BookGiveOutRecord. Ми бачимо, що значення зовнішніх ключів OutLibrianCode, InventoryCode, InLibrianCode й стовпця ReaderCode відповідно дорівнюють 2, 3, 6 і 4. Отже, перед введенням першого рядка ми повинні виконати ряд дій. Їх послідовність довільна.
Введення першого рядка в таблицю BookGiveOutRecord ми почнемо з таблиці BookInventoryNumbers. У неї необхідно додати рядок, в якому значення первинного ключа Code дорівнює 6. Тепер прийшла черга таблиці Librarians. На її первинний ключ Code посилаються одразу два зовнішніх ключі таблиці BookGiveOutRecord. Отже, в таблицю Librarians нам необхідно ввести два рядки. У першому значення первинного ключа Code має дорівнювати 4, а у другому – 3. У таблиці Readers повинен з'явитися рядок зі значенням первинного ключа Code, що дорівнює 2. Тільки після всіх цих дій правила посилальної цілісності БД «БІБЛІОТКА» дадуть нам можливість ввести першій рядок у таблицю BookGiveOutRecord.
Для кожного рядка, що додається у таблицю BookGiveOutRecord, був створений окремий оператор INSERT (Додаток Г). Результати їх роботи Ви можете бачити в таблиці В.11.
Таблиця В.11
Code | ReaderCode | OutLlibrarianCode | InventaryCode | IssueDate | ReturnDate | FactreturnDate | InLibrarianCode |
---|---|---|---|---|---|---|---|
1 | 2 | 4 | 6 | 11.09.2004 | 25.09.2004 | 24.09.2004 | 3 |
2 | 3 | 4 | 4 | 02.09.2004 | 16.09.2004 | 11.12.2004 | 3 |
3 | 6 | 4 | 3 | 02.09.2004 | 16.09.2004 | 16.09.2004 | 1 |
4 | 4 | 3 | 6 | 30.10.2004 | 13.11.2004 | 10.01.2005 | 6 |
5 | 7 | 10 | 7 | 10.11.2009 | 24.11.2009 | 24.11.2009 | 12 |
6 | 9 | 7 | 12 | 15.12.2009 | 29.12.2009 | NULL | NULL |
7 | 11 | 8 | 10 | 06.02.2009 | 20.02.2009 | 19.02.2009 | 7 |
8 | 7 | 9 | 8 | 07.03.2009 | 21.03.2009 | 10.04.2009 | 10 |
9 | 9 | 8 | 12 | 05.02.2010 | 28.02.2010 | NULL | NULL |
10 | 12 | 10 | 15 | 21.09.2010 | 05.10.2010 | 03.10.2010 | 9 |
1. Цілісність сутності та посилальна цілісність реляційної БД підтримують за допомогою унікальних значень первинних ключів в таблицях, навіть якщо вони явно не визначені в операторах INSERT.
2. В сучасних СУБД унікальність цілочислових значень не складених первинних та потенційних ключів підтримують за допомогою генераторів або автоінкрементої властивості стовпця таблиці.
3. Для підтримки унікальності значень складених потенційних і первинних ключів необхідно використовувати тригера та збережені процедури.
4. Порядок заповнення таблиць завжди може збігається з послідовністю їх створення. Однак це не завжди оптимальний шлях додавання інформації в таблиці реляційної бази даних.
© Куваєв Я.Г., 2005—2023.
Всі права захищені.
Вся інформація, яка розміщена на цьому веб-сайті, призначена тільки для персонального використання і не підлягає подальшому відтворенню і/або поширенню в будь-якій формі, інакше як за письмовим дозволом Автора.