Цель: раскрыть особенности добавления информации в реляционную базу данных, не нарушая целостности сущностей, ссылочную целостность и корпоративные ограничения целостности.
Разработчик баз данных должен понимать последовательность заполнения таблиц информацией до создания физической модели реляционной базы данных. Строго говоря, она совпадает с порядком создания таблиц БД. Следуйте этому правилу и не будете ошибаться. Но не забывайте, что чем сложнее БД, тем больше вариантов последовательностей создания и заполнения таблиц информацией. Вам нужно будет выбрать оптимальный вариант для этого.
На этапе физического моделирования реляционной базы данных определяются механизмы целостности сущностей, ссылочной целостности и корпоративные ограничения целостности. Они накладывают ряд необходимых ограничений на ввод, корректировку и удаление информации в таблицах БД. Эти ограничения определяют последовательность заполнения таблиц. Если всё сделано правильно, то у пользователей не будет никаких шансов обойти эти механизмы.
Заполнение информацией учебной БД «БИБЛИОТЕКА» является необходимым этапом обучения. Порядок ввода информации в её таблицы совпадает с последовательностью их создания. Такой подход позволит корректно ввести информацию в БД даже при отсутствии ряда необходимых ограничений. Их Вам будет предложено добавить самостоятельно на практических занятиях.
Ввод информации в таблицу 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 | АH | 64277 | 23.12.1972 | Украина, Львов | М | Львов | 06.01.1988 | NULL |
15 | АК | 89125 | 07.05.1980 | Украина, г. Киев | М | Киев | 10.01.1998 | NULL |
16 | АK | 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 | «Недра» | 622.7 | 622.7-52/Т | NULL |
2 | Решение задач по автоматизации процессов обогащения и металлургии | 01.01.1969 | 2000 | «Наука» | 622.7-52 | 622.7-52(075)/Т | NULL |
3 | Асимптотические методы оптимального управления | 01.01.1987 | 1000 | «Автомат» | 681.513.5 | 681.513.5:/А | NULL |
4 | Синтез оптимальных автоматических систем | 01.31.1984 | 5000 | «Автомат» | 681.513.5 | 681.513.5:/ДО | NULL |
5 | Методы оптимизации стохастических систем | 01.01.1987 | 4500 | «Матстат» | 681.513.5 | 681.513.5:/ДО | NULL |
6 | Автоматизированные системы управления технологическим процессом обогащения руды | 31.01.1987 | 4000 | «Автомат» | 622.7-52 | 622.7-52/П | NULL |
7 | C/C++ Программирование на языке высокого уровня | 11.01.2007 | 5500 | «Питер» | 681.3.06 | 681.3.06(075) | NULL |
8 | Компьютерные сети. Принципы, технологии, протоколы | 31.01.2006 | 6000 | «Питер» | 004.72 | 004.72(075) | NULL |
9 | Справочник по дифференциальным уравнениям с частными производными первого порядка | 31.01.2003 | 10000 | «ФИЗМАТЛИТ» | 517.9 | 517.9 | NULL |
10 | Теория вероятностей и математическая статистика | 31.01.2004 | 1000 | «Питер» | 519.2 | 519.2 | NULL |
11 | C#. Программирование на языке высокого уровня | 31.01.2009 | 1500 | «Питер» | 004.43 | 004.43 | NULL |
12 | Теория вероятностей и математическая статистика | 31.01.2005 | 2000 | «Высшая школа» | 519.2 | 519.2 | NULL |
13 | Теория вероятностей и математическая статистика | 31.01.2002 | 2500 | «ФИЗМАТЛИТ» | 519.2 | 519.2 | NULL |
14 | Дискретно-групповые методы интегрирования обыкновенных дифференциальных уравнений | 31.01.1991 | 7000 | «ЛИИАН» | 517.9 | 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.
Все права защищены.
Вся информация, размещенная на данном веб-сайте, предназначена только для персонального использования и не подлежит дальнейшему воспроизведению и/или распространению в какой-либо форме, иначе как с письменного разрешения Автора.