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

Курсовые работы / Разработка клиент-серверного приложения. База данных для магазина нумизматики

.pdf
Скачиваний:
168
Добавлен:
28.06.2014
Размер:
1.03 Mб
Скачать

Доставка

№_заказа №_заказа №_заказа Дата_доставки №_заказа Время_доставки №_заказа Табельный_номер

Заказ

№_заказа №_заказа №_заказа Дата_заказа №_заказа Время_заказа №_заказа Стоимость_заказа

№_заказа

Логин

№_заказа

Табельный номер

№_заказа Код_статуса №_заказа Код_способа_оплаты

№_заказа Код_способа_получения

Монета

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

 

 

 

символов(букв или

 

 

 

цифр)

 

e-mail

 

Строка вида *@*.*

 

Пол

 

М или Ж

 

Почтовый индекс

 

От "000001" до

 

 

 

"999999"

 

12

2.

Сотрудник

 

 

e-mail

 

Строка вида *@*.*

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