Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

FireBird. Установка, разработка баз данных, реализация запросов. Методические указания

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
867 Кб
Скачать

Name stroka Primary key,

Data_izg Date not null check(Data_izg<current_date),

Gruz integer not null check(Gruz>0)

);

Рисунок 13– Пример создания таблицы «Баржа» в FireBird

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

Primary key (<список столбцов ПК>)

Foreign key (<список столбцов ВК>)

references <имя основной таблицы> (<список столбцов ПК основной таблицы>) on delete <стратегия> on update <стратегия>

В качестве стратегий можно задать следующие:

cascade. Каскадное удаление строк подчиненной таблицы,

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

которых происходит обновление первичного ключа;

set null подразумевает, что столбцам внешнего ключа будет присвоено значение null при удалении строк из основного отношения или обновлении первичного ключа в строках основного отношения;

21

set default означает, что столбцам внешнего ключа будет присвоено значение по умолчанию при удалении строк из основного отношения или обновлении первичного ключа в строках основного отношения;

restrict означает запрет на удаление строк или обновление первичного ключа в основном отношении, если им в подчиненном отношении соответствуют некоторые строки.

Если при создании таблицы не задана ни одна стратегия, возможно,

ссылочная целостность обеспечена процедурным путем, т.е. созданы необходимы триггеры. Если нет, то СУБД FireBird будет придерживаться стратегии Restrict.

SQL - скрипты выполняются в режиме интерпретации, поэтому сначала создаются основные таблицы, а потом – подчиненные, которые ссылаются на основные.

3.3Пример разработки БД

Вкачестве примера рассмотрим процесс проектирования и реализации БД для предметной области «Морской порт». Ниже приведено описание предметной области.

Известно, что к морскому порту приписано несколько судов. Судно может относиться к такой категории как буксир, баржа или пассажирское судно. Каждая категория обладает разным набором атрибутов. Например,

баржа характеризуется грузоподъемностью, буксир – мощностью, а

пассажирское судно может иметь различное число палуб и кают. Пассажирские суда осуществляют перевозку пассажиров. Каждый рейс характеризуется:

номером рейса, днями отплытия, портом назначения, портом отбытия и временем в пути. О сотрудниках порта нужно хранить данные: Ф.И.О., дата рождения, должность (капитан, кок, штурман и т.д.), адрес проживания. Одно и то же судно может осуществлять разные рейсы. Однако к каждому судну

22

прикреплена определенная команда во главе с капитаном. Таких команд в порту несколько. Также необходимо хранить информацию о пассажирах,

совершавших рейсы на судах порта.

Построенная ER-диаграмма приведена на рисунке 14.

В сущности «Строка расписания» атрибуты «понедельник», «вторник» и

так далее могут принадлежать логическому типу. В этом случае атрибут примет значение «истина», если рейс осуществляет отплытие в этот день недели и

«ложь», если отплытия нет. Сущность «Отправление» служит для разрыва связи M : N между сущностями «Рейс» и «Пассажирское судно». Сущность

«Билет» разрывает аналогичную связь между сущностями «Отправление» и «Пассажир». Экземпляры сущности «Населенный пункт» могут выступать в двух ролях – являться конечным пунктом отплытия и исходным пунктом. В

уникальный идентификатор сущности «Отправление» входит связь с сущностью «Отправление». В уникальный идентификатор сущности «Билет» входит связь с сущностью «Отправление». Связь с сущностью «Сотрудник» входит в уникальный идентификатор сущности «Назначение на должность».

Между сущностями «Пассажирское судно», «Буксир» и «Баржа» имеют место взаимоисключающие связи, т.к. в приказе сотрудник может быть назначен на судно, относящееся только к одному из перечисленных типов.

Такие связи моделируются с помощью арка.

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

23

Рисунок 14– ER –диаграмма предметной области

24

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

Баржа (наименование, дата изготовления, грузоподъемность)

Буксир (наименование, дата изготовления, мощность)

Пассажирское судно (наименование, дата изготовления, количество кают,

количество палуб)

Населенный пункт (код пункта, наименование)

Пассажир (код пассажира, ФИО, серия паспорта, номер паспорта)

Должность (код должности, наименование)

Сотрудник (табельный номер, ФИО, дата рождения, адрес)

Приказ о назначении должности (дата, код должности, табельный номер сотрудника)

Приказ о прикреплении к судну (номер, дата, табельный номер сотрудника,

наименование пассажирского судна, наименование баржи, наименование буксира)

Отправление (дата, номер рейса, наименование пассажирского судна)

Билет (место, дата рейса, номер рейса, код пассажира)

Строка расписания рейсов (номер рейса, время в пути, понедельник,

вторник, среда, четверг, пятница, суббота, воскресенье, код пункта отправки, код пункта прибытия)

Напишем SQL-скрипты для создания базы данных, доменов и таблиц:

create database 'E:\DataBase.fdb' user 'SYSDBA' password 'masterkey'; create domain code as integer not null check (value>0);

create domain stroka as char (100) not null;

create table Barja (Name stroka Primary key,

Data_izg Date not null check(Data_izg< current_date),

25

Gruz integer not null check(Gruz>0));

create table Buksir (Name stroka Primary key,

Data_izg Date not null check(Data_izg< current_date), Mos integer not null check(Mos>0));

create table Pas_sudno (Name stroka Primary key,

Data_izg Date not null check(Data_izg< current_date), Kol_vo_palub integer not null check(Kol_vo_palub>0), Kol_vo_kayut integer not null check(Kol_vo_kayut>0));

create table Sotrudnik (Tab_nomer Code Primary key, FIO Stroka,

Dr Date not null check((Dr<'01.01.1996') and (Dr>'01.01.1910')), Adres Stroka);

create table Dolgnost (Kod Code Primary key, Name Stroka);

create table Pas (Kod Code Primary key,

FIO Stroka,

Seriya_pasporta integer not null,

Nomer_pasporta integer not null);

create table Gorod

26

(Kod Code Primary key, Name Stroka);

create table Stroka_raspisaniya (Nomer_reisa Code Primary key, Vremya_v_puti Stroka, Ponedelnik integer not null, Vtornik integer not null,

Sreda integer not null,

Chetverg integer not null,

Pyatnica integer not null,

Subbota integer not null,

Voskresenye integer not null,

Code_otprav Code,

Code_pribt Code,

Foreign key (Code_otprav) References Gorod (Kod) on update cascade, Foreign key (Code_pribt) References Gorod (Kod) on update cascade);

create table Prikaz2 (Nomer Code Primary key,

Data Date not null check((Data< current_date) and (Data>'01.01.1910')), Tab_nomer Code,

Name_sudno_Pas char(15), Name_sudno_Barja char(15), Name_sudno_Buksir char(15), Foreign key (Tab_nomer)

References Sotrudnik (Tab_nomer)

27

on update cascade, Foreign key (Name_sudno_Barja)

References Barja (Name)

on update cascade,

Foreign key (Name_sudno_Buksir)

References Buksir (Name)

on update cascade, Foreign key (Name_sudno_Pas) References Pas_sudno (Name)

on update cascade);

create table Otpravlenie (Nomer_reisa code, Data Date not null, Name_pas_sudno stroka,

Primary key (Nomer_reisa, Data), Foreign key (Name_pas_sudno) References Pas_sudno (Name) on update cascade,

Foreign key (Nomer_reisa)

References Stroka_raspisaniya (Nomer_reisa)

on update cascade);

create table Bilet

(Nomer_reisa integer not null check(Nomer_reisa>0), Data Date check((Data<'01.01.2016') and (Data>'01.01.1910')),

Mesto integer not null check(Mesto>0),

Kod_Pas Code,

primary key (Mesto, Data, Nomer_reisa),

Foreign key (Kod_Pas)

28

References Pas (Kod)

on update cascade,

Foreign key (Nomer_reisa, Data) References Otpravlenie (Nomer_reisa, Data) on update cascade);

create table Prikaz1

(Data Date not null check((Data< current_date) and (Data>'01.01.1910')), Nomer_dol Code,

Tab_nomer Code,

Primary key (Data, Nomer_dol, Tab_nomer),

Foreign key (Nomer_dol)

References Dolgnost (Kod)

on update cascade, Foreign key (Tab_nomer) References Sotrudnik (Tab_nomer) on update cascade);

Далее при рассмотрении операторов манипулирования данными,

оператора запросов select, хранимых процедур и триггеров будут использоваться примеры, основанные на базе данных морского порта.

3.4 Операторы манипулирования данными

Вставка, удаление и обновление осуществляется с помощью операторов манипулирования данными, описанными ниже.

Insert into <имя таблицы> [(<список столбцов>)]

values

(<список выражений>)

29

Оператор осуществит вставку новой строки в таблицу. Если список столбцов опущен, подразумевается все столбцы таблицы. Значения выражений в порядке следования присваиваются соответствующим столбцам

Если тип выражения не совпадает с типом столбца, возникает ошибка.

Если в списке столбцов заданы не все столбцы, пропущенные столбцы примут значения null.

Пример:

Barja (name, data_izg , gruz )

1) insert into Barja values

('Fortune', '15.06.1967', 15000);

2) insert into Barja values

('Riga', '22.09.1998', 25000);

Обновление данных в таблице осуществляется с помощью оператора update. Общий вид оператора приведен ниже.

Update < имя таблицы> set

< столбец_1 > = < выражение_1>, …..,

< столбец_n > = < выражение_n >, [ where < условие > ];

Оператор обновляет таблицу, присваивая новые значения заданным столбцам. Если фраза where опущена, то обновляется все строки таблицы, в

30