
Курсовые работы / Разработка клиент-серверного приложения. База данных для магазина нумизматики
.pdfДоставка
№_заказа №_заказа №_заказа Дата_доставки №_заказа Время_доставки №_заказа Табельный_номер
Заказ
№_заказа №_заказа №_заказа Дата_заказа №_заказа Время_заказа №_заказа Стоимость_заказа
№_заказа |
Логин |
№_заказа |
Табельный номер |
№_заказа Код_статуса №_заказа Код_способа_оплаты
№_заказа Код_способа_получения
Монета
id_монеты id_монеты id_монеты Цена id_монеты Фото id_монеты Название id_монеты Металл id_монеты Вес id_монеты Диаметр
id_монеты Код_состояния id_монеты Количество_на_складе id_монеты Номинал
id_монеты Страна
Состояние
Код_состояния Код_состояния Код_состояния Обозначение_состояния Код_состояния Расшифровка_обозначения
Статус_заказа
Код_статуса Код_статуса Код_статуса Статус
Способ_оплаты
Код_способа-оплаты Код_способа-оплаты Код_способа-оплаты Способ_оплаты
Способ_получения
Код_способа_получения Код_способа_получения Код_способа_получения Способ_получения
Обоснование нахождения РБД в третьей нормальной форме. Таблица находится в первой нормальной форме (1НФ) тогда и только тогда, когда каждое поле отношения содержит атомарное значение.
11

Все поля в таблицах имеют атомарные значения благодаря типу данных этих полей.
Отношение находится во 2НФ, если оно находится в 1НФ и каждый неключевой атрибут функционально полно зависит от ключа.
Выше уже показано, что каждый неключевой атрибут функционально полно зависит от ключа для всех для всех сущностей разрабатываемой базы данных.
Отношение находится в 3НФ, если оно находится во 2НФ и каждый неключевой атрибут нетранзитивно зависит от первичного ключа.
Легко видеть, что между неключевыми атрибутами любой таблицы нет функциональной зависимости, отсюда следует, что каждый неключевой атрибут нетранзитивно зависит от ключа.
Обоснование выбора ключей.
Рассмотрим обоснование выбора ключей на примере сущности Сотрудник. Для остальных сущностей выбор ключа обосновывается аналогично.
Табельный_номер |
Табельный_номер (Следует из рефлексивности) |
Табельный_номер |
ФИО |
Табельный_номер e-mail |
|
Табельный_номер |
Телефон |
Табельный_номер |
Должность |
Табельный_номер Табельный_номер, Табельный_номер ФИО Табельный_номер (Табельный_номер, ФИО), Табельный_номер e-mail
Табельный_номер (Табельный_номер, ФИО, e-mail), Табельный_номер Телефон Табельный_номер (Табельный_номер, ФИО, e-mail, Телефон), Табельный_номер Должность Табельный_номер (Табельный_номер, ФИО, e-mail, Телефон, Должность)
Каждое следование следует из аксиомы Армстронга об аддитивности.
Проектирование правил целостности БД
|
Декларативные ограничения: |
||
1. Покупатель |
|
|
|
Логин |
|
Не менее 3 символов |
|
|
|
(букв или цифр), |
|
|
|
начинается с буквы |
|
Пароль |
|
Не менее 4 |
|
|
|
символов(букв или |
|
|
|
цифр) |
|
|
Строка вида *@*.* |
|
|
Пол |
|
М или Ж |
|
Почтовый индекс |
|
От "000001" до |
|
|
|
"999999" |
|
12
2. |
Сотрудник |
|
|
|
Строка вида *@*.* |
||
3. |
Заказ |
|
|
Логин |
|
Не менее 3 символов |
|
|
|
|
(букв или цифр), |
|
|
|
начинается с буквы |
Код_статуса |
|
От 1 до 5 |
|
Код_способа_оплаты |
|
От 1 до 4 |
|
Код_способа_получения |
|
От 1 до 2 |
|
4. |
Монета |
|
|
Код состояния |
От 1 до 13 |
Процедурные ограничения:
При добавлении и изменении записи в таблице заказ необходимо убедиться, что в таблицах сотрудник и покупатель существуют записи с аналогичными табельным номером и логином соответственно.
Также, если в добавляемой или изменяемой в таблице заказ записи код способа оплаты = 4 (наличные), то код способа получения должен быть = 2 (курьерская доставка) и выведено сообщение о необходимости добавить новую запись в таблицу доставка.
При добавлении и изменении записи в таблице доставка необходимо убедиться, что в таблицах сотрудник и заказ существуют записи с аналогичными табельным номером и № заказа соответственно, а также что в соответствующей записи в таблице заказ код способа получения = 2 (курьерская доставка).
Запись в таблице доставка нельзя удалить, если в записи соответствующего ей заказа код способа получения = 2 (курьерская доставка)
При добавлении и изменении записи в таблице заказ_товар необходимо убедиться, что в таблицах заказ и монета существуют записи с аналогичными № заказа и id_монеты соответственно.
Реализация базы данных
Создание таблиц и индексов с учетом декларативных ограничений.
Создадим таблицы с учетом декларативных ограничений.
create table pokupatel
(p_login char(20) not null, p_password char(20) not null ,
e_mail char(20) not null check (e_mail like '%@%.%'), fio char(40) not null,
adres char(60) not null,
post_index char(6) not null check (post_index between '0000001' and '999999'),
d_rogd date,
13
d_reg date not null,
pol char(1) check (pol like 'М' or pol like 'Ж'), tel_numb char(15) not null)
create table sotrudnik
(tab_nomer integer not null, fio char(40) not null,
e_mail char(20) not null check (e_mail like '%@%.%'), tel_numb char(15) not null,
dolgnost char(20) not null)
create table zakaz
(nomer_zakaza integer not null, data_zakaza date,
vremja_zakaza time, stoimost money,
status_kod integer not null check(status_kod between 1 and 5), kod_oplaty integer not null check(kod_oplaty between 1 and 4), kod_poluch integer not null check(kod_poluch between 1 and 2), p_login char(20) not null,
tab_nomer integer not null)
create table dostavka
(nomer_zakaza integer not null, data_dostavki date, vremja_dostavki time,
tab_nomer integer not null)
create table moneta
(id_monety integer not null, nazvanie char(60) not null, price money not null,
foto image, metal char(50),
ves float check (ves >= 0), diam float check (diam >= 0), nominal char(20),
strana char(80),
kod_sost integer not null check(kod_sost between 1 and 13), kol_na_sklade integer check (kol_na_sklade >= 0))
create table sostoyanie
(kod_sost integer not null check(kod_sost between 1 and 13), obozn char(10) not null,
obozn_rus char(20) not null)
create table zakaz_tovar (nomer_zakaza integer not null, id_monety integer not null)
create table sposob_poluch (kod_poluch integer not null, sposob char(20) not null)
create table sposob_oplaty (kod_oplaty integer not null, sposob char(20) not null)
create table status_zakaza (status_kod integer not null, status_zakaza char(20) not null)
14
Создадим индексы для основных полей таблиц базы данных:
create unique index logind on pokupatel(p_login) create index fioind on pokupatel(fio)
create index adresind on pokupatel(adres) create index postind on pokupatel(post_index) create index telind on pokupatel(tel_numb)
create unique index tabind on sotrudnik(tab_nomer)
create unique index ind1 on zakaz(nomer_zakaza) create index ind2 on zakaz(data_zakaza)
create index ind3 on zakaz(vremja_zakaza) create index ind4 on zakaz(stoimost) create index ind5 on zakaz(status_kod) create index ind6 on zakaz(kod_oplaty) create index ind7 on zakaz(kod_poluch) create index ind8 on zakaz(p_login) create index ind9 on zakaz(tab_nomer)
create unique index zakazind on dostavka(nomer_zakaza)
create unique index monetaind on moneta(id_monety) create index ind10 on moneta(nazvanie)
create index ind11 on moneta(price) create index ind12 on moneta(metal) create index ind13 on moneta(ves) create index ind14 on moneta(diam) create index ind15 on moneta(nominal) create index ind16 on moneta(strana) create index ind17 on moneta(kod_sost)
create index ind18 on moneta(kol_na_sklade)
create unique index ind19 on sostoyanie(kod_sost) create index ind20 on zakaz_tovar(nomer_zakaza) create index ind21 on zakaz_tovar(id_monety)
create unique index ind22 on sposob_poluch(kod_poluch) create unique index ind23 on sposob_oplaty(kod_oplaty) create unique index ind24 on status_zakaza(status_kod)
Реализация процедурных ограничений при помощи триггеров.
Триггеры реализованы в том же порядке, в котором описаны процедурные ограничения.
create trigger trig1 on zakaz for insert,update as
if @@ROWCOUNT=1 begin
if ((select count(*) from pokupatel,inserted where pokupatel.p_login=inserted.p_login)=0) begin
Rollback tran
select ' Неверный логин пользователя!'
end
end
create trigger trig2 on zakaz for insert,update as
if @@ROWCOUNT=1 begin
if ((select count(*) from sotrudnik,inserted
where sotrudnik.tab_nomer=inserted.tab_nomer)=0) begin
15
Rollback tran
select ' Неверный табельный номер продавца!'
end
end
create trigger trig4 on zakaz for insert,update as
if @@ROWCOUNT=1 begin
if ((select count(*) from inserted
where inserted.kod_oplaty = 4 and inserted.kod_poluch !=2)>0) begin
Rollback tran
select 'Оплата наличными возможна только в случае доставки
курьером'
end
else
begin
select 'Необходимо добавить запись о доставке'
end
end
create trigger trig5 on dostavka for insert,update as
if @@ROWCOUNT=1 begin
if ((select count(*) from zakaz,inserted
where zakaz.nomer_zakaza=inserted.nomer_zakaza and zakaz.kod_poluch=2)=0)
begin
Rollback tran
select 'Неверный номер заказа или заказ не доставляется
курьером!' end
end
create trigger trig6 on dostavka for insert,update as
if @@ROWCOUNT=1 begin
if ((select count(*) from sotrudnik,inserted
where sotrudnik.tab_nomer=inserted.tab_nomer)=0) begin
Rollback tran
select ' Неверный табельный номер сотрудника!'
end
end
create trigger trig7 on dostavka for delete as
if @@ROWCOUNT=1 begin
if ((select count(*) from zakaz,deleted
where zakaz.nomer_zakaza=deleted.nomer_zakaza and zakaz.kod_poluch=2)>0)
begin
Rollback tran
select ' Нельзя удалять запись о доставке, не удалив соответствующий заказ!'
end
end
create trigger trig8 on zakaz_tovar for insert,update as
if @@ROWCOUNT=1 begin
if ((select count(*) from zakaz,inserted
where zakaz.nomer_zakaza=inserted.nomer_zakaza)=0)
16

begin
Rollback tran
select 'Неверный номер заказа!'
end
end
create trigger trig9 on zakaz_tovar for insert,update as
if @@ROWCOUNT=1 begin
if ((select count(*) from moneta,inserted
where moneta.id_monety=inserted.id_monety)=0) begin
Rollback tran
select 'Неверный id монеты!'
end
end
Реализация клиентской части приложения
Разработанная клиентская часть позволяет добавлять и редактировать записи в таблицах покупатель, монета, заказ, заказ_товар и доставка, а также искать данные о заказах на сумму больше указанной и данные о всех монетах указанной страны.
17

18