Главное меню

EN | RU | UK

На главную

ПРИЛОЖЕНИЕ В. Добавление информации в БД «БИБЛИОТЕКА»

Наверх страницы
Приложение В
Цель

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

В.1. Очерёдность заполнения таблиц

Разработчик баз данных должен понимать последовательность заполнения таблиц информацией до создания физической модели реляционной базы данных. Строго говоря, она совпадает с порядком создания таблиц БД. Следуйте этому правилу и не будете ошибаться. Но не забывайте, что чем сложнее БД, тем больше вариантов последовательностей создания и заполнения таблиц информацией. Вам нужно будет выбрать оптимальный вариант для этого.

На этапе физического моделирования реляционной базы данных определяются механизмы целостности сущностей, ссылочной целостности и корпоративные ограничения целостности. Они накладывают ряд необходимых ограничений на ввод, корректировку и удаление информации в таблицах БД. Эти ограничения определяют последовательность заполнения таблиц. Если всё сделано правильно, то у пользователей не будет никаких шансов обойти эти механизмы.

Заполнение информацией учебной БД «БИБЛИОТЕКА» является необходимым этапом обучения. Порядок ввода информации в её таблицы совпадает с последовательностью их создания. Такой подход позволит корректно ввести информацию в БД даже при отсутствии ряда необходимых ограничений. Их Вам будет предложено добавить самостоятельно на практических занятиях.

В.2. Таблица PhoneTypes («ТИПЫ ТЕЛЕФОНОВ»)

Ввод информации в таблицу PhoneTypes ограничен целостностью сущности и корпоративными ограничениями целостности. За целостность сущности отвечает первичный ключ Code. Он был определён в одноимённом столбце Code. Корпоративные ограничения целостности обеспечиваются доменами AllCode и AllNameType (см. таблицу PhoneTypes в физической модели «БИБЛИОТЕКА»).

Физическое моделирование базы данных начнём с описания двух типов механизмов, обеспечивающих уникальные значения первичных ключей. Первый тип боле распространённый и понятный. Он задаёт автоинкрементен для ключевого столбца типа INTEGER в операторе CREATE TABLE. В СУБД Interbase реализован второй тип. Он определяет уникальное значение ключа с помощью генератора. Его необходимо создать с помощью оператора CREATE GENERATOR. Мы это сделали для первичного ключа таблицы PhoneTypes:

       CREATE GENERATOR PhoneTypesCode;

Теперь необходимо задать его начальное значение. В СУБД Interbase для этого используется оператор SET GENERATOR. Генераторы обычно устанавливаются на начальное значение, равное нулю. Оператор, определяющий начальное значение для генератора PhoneTypesCode, выглядит так:

       SET GENERATOR PhoneTypesCode TO 

Оба механизма генерируют уникальное значение первичного ключа в операторе 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

Информация в таблице PhoneTypes («ТИПЫ ТЕЛЕФОНОВ»)
Code Name
1 Домашний
2 Рабочий
3 Мобильный
4 Спутниковый

 

В.3. Таблица PassportData («ПАСПОРТНЫЕ ДАННЫЕ»)

Добавление информации в таблицу 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');

Всего в таблицу PassportData добавлено 24 строки (Приложение Г). Вся добавленная информация приведена в таблице В.2.

Таблица В.2

Информация в таблице PasportData («ПАСПОРТНЫЕ ДАННЫЕ»)
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

 

В.4. Таблица Librarians («БИБЛИОТЕКАРИ»)

В таблице 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

Информация в таблице Librarians («БИБЛИОТЕКАРИ»)
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

 

В.5. Таблица Readers («ЧИТАТЕЛИ»)

В учебной БД «БИБЛИОТЕКА» таблица 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

Информация в таблице Readers («ЧИТАТЕЛИ»)
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

 

В.6. Таблица Phones («ТЕЛЕФОНЫ»)

Таблица 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

Информация в таблице Phones («ТЕЛЕФОНЫ»)
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

 

В.7. Таблица Books («КНИГИ»)

В таблице 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

Информация в таблице Books («КНИГИ»)
Code Name IssueYear Drawing BookPublishers UDK Cipher Note
1 Автоматизация производственных процессов на обогатительной фабрике 1985 6000 «Недра» NULL 622.7-52/Т NULL
2 Решение задач по автоматизации процессов обогащения и металлургии 1969 2000 «Наука» NULL 622.7-52(075)/Т NULL
3 Асимптотические методы оптимального управления 1987 1000 «Автомат» NULL 681.513.5:/А NULL
4 Синтез оптимальных автоматических систем 1984 5000 «Автомат» NULL 681.513.5:/ДО NULL
5 Методы оптимизации стохастических систем 1987 4500 «Матстат» NULL 681.513.5:/ДО NULL
6 Автоматизированные системы управления технологическим процессом обогащения руды 1987 4000 «Автомат» NULL 622.7-52/П NULL
7 C/C++ Программирование на языке высокого уровня 2007 5500 «Питер» NULL 681.3.06(075) NULL
8 Компьютерные сети. Принципы, технологии, протоколы 2006 6000 «Питер» NULL 004.72(075) NULL
9 Справочник по дифференциальным уравнениям с частными производными первого порядка 2003 10000 «ФИЗМАТЛИТ» NULL 517.9 NULL
10 Теория вероятностей и математическая статистика 2004 1000 «Питер» NULL 519.2 NULL
11 C#. Программирование на языке высокого уровня 2009 1500 «Питер» NULL 004.43 NULL
12 Теория вероятностей и математическая статистика 2005 2000 «Высшая школа» NULL 519.2 NULL
13 Теория вероятностей и математическая статистика 2002 2500 «ФИЗМАТЛИТ» NULL 519.2 NULL
14 Дискретно-групповые методы интегрирования обыкновенных дифференциальных уравнений 1991 7000 «ЛИИАН» NULL 517.9-37 NULL

 

В.8. Таблица BookAuthors («АВТОРЫ КНИГ»)

Первичный ключ по столбцу 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

Информация в таблице BookAuthors («АВТОРЫ КНИГ»)
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

 

В.9. Таблица CoAuthorship («СОАВТОРСТВО»)

В физической модели БД «БИБЛИОТЕКА» определён составной первичный ключ для таблицы 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

Информация в таблице Сoаuthorship («СОАВТОРСТВО»)
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

 

В.10. Таблица BookFunds («ТИПЫ ФОНДОВ КНИГ»)

Целостность сущности в таблице BookFunds обеспечивается уникальностью значений в столбце Code. Он выбран в качестве первичного ключа. Генератор BookFundsCode обеспечивает уникальные ключевые значения:

CREATE GENERATOR BookFundsCode;

SET GENERATOR BookFundsCode TO 

Принцип работы генераторов описан выше. Ниже приведены операторы INSERT, которые добавляют две строки в таблицу BookFundsCode:

INSERT TABLE BookFunds

    (Code, Name)

VALUES

    (GEN_ID(BookFundsCode, 1), 'НТБ');

INSERT TABLE BookFunds

    (Code, Name)

VALUES

    (GEN_ID(BookFundsCode, 1), 'Студенческий');

В таблице BookFundsCode всего две строки. Потому можете видеть все операторы INSERT из script-файла, которые добавляют в неё информацию. Результаты их работы приведены в таблице В.9.

Таблица В.9

Информация в таблице BookFunds («ТИПЫ ФОНДОВ КНИГ»)
Code Name
1 НТБ
2 Студенческий

 

В.11. Таблица BookInventoryNumbers («ИНВЕНТАРНЫЕ НОМЕРА КНИГ»)

В таблице 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

Информация в таблице BookInventoryNumbers («ИНВЕНТАРНЫЕ НОМЕРА КНИГ»)
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

 

В.12. Таблица BookGiveOutRecord («УЧЕТ ВЫДАЧИ КНИГ»)

В таблице 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.

Для каждой строки, добавляемой в таблицу BookInventoryNumbers, был создан отдельный оператор INSERT (Приложение Г). Результаты их работы Вы можете видеть в таблице В.11.

Таблица В.11

Информация в таблице BookGiveOutRecord («УЧЕТ ВЫДАЧИ КНИГ»)
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—2020.

Все права защищены.

Вся информация, размещенная на данном веб-сайте, предназначена только для персонального использования и не подлежит дальнейшему воспроизведению и/или распространению в какой-либо форме, иначе как с письменного разрешения Автора.