Методология проектирования баз данных

Московский Государственный Технический Университет Им. Н.Э. Баумана



Калужский филиал



Кафедра САУ и электротехники







Методология проектирования баз данных







Расчётно-пояснительная записка к курсовой работе

по курсу «Проектирование алгоритмов и

программного обеспечения»











Выполнил: студент группы САУ-81 

Лебедев А.Л.

Руководитель: доцент, к. т. н.

Николаенко С. И.









Калуга

2005 г.


I. Проект базы данных для предприятия, занимающегося заготовкой древесины, её переработкой и сбытом готовой продукции



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

Заготовка древесины заключается в следующем. Лесничество выделяет предприятию лесобилеты, в которых указано, где находятся делянки и сколько леса может быть заготовлено на каждом участке. Также указывается порода древесины. На предприятии существует определённое лицо – заведующий делянками, - который выписывает у лесничества лесобилеты, выдаёт делянки бригадам, принимает делянки от бригад, сдаёт участки назад лесничеству. Назначенная на данную делянку бригада выпиливает лес и привозит его на базу предприятия.

Привезённый на базу лес сдаётся начальнику базы, который фиксирует кубатуру кругляка. 

На территории предприятия находится несколько цехов по переработке древесины, за каждым цехом закреплена сушильная камера; также имеется склад готовой продукции. Цеха пронумерованы. В каждом цехе работает бригада, (в цехе их может быть несколько), которая осуществляет распиловку древесины и её сдачу на склад продукции. Бригадир получает лес от начальника базы. Приём готовой продукции ведёт кладовщик.

На предприятии определено также лицо, которое занимается продажей товара – начальник сбыта. Он договаривается с фирмами-клиентами об объёмах и датах поставок, видах продукции и, соответственно, определяет задание цеховым бригадам.

Работники и фирмы-клиенты могут иметь телефон. Их может быть несколько.

При работе с электронными документами должна быть доступна следующая информация:

штат сотрудников предприятия (таб. №, ФИО, дом. адрес, телефон, дата приёма на работу и назначения на должность, должность, номер бригады);

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

какая бригада работает на делянке;

сколько леса бригада привезла на базу. Сколько всего леса и какого хранится на базе;

какую продукцию и по какой цене производит предприятие;

какой план, когда и на какой срок выдан начальником сбыта цеховым бригадам;

сколько леса выписал начальник бригады на базе и сдал продукции на склад. Сколько и какой продукции хранится на складе;

с какими фирмами-клиентами сотрудничает предприятие (название фирмы, адрес и телефон);

какой заказ и на какой срок сделан предприятию фирмой-клиентом (вид, количество продукции и по какой цене);

какой товар, сколько, по какой цене и когда отгружен фирме-клиенту.



Типовые операции (транзакции)



приём на работу, приписывание к бригадам, назначение на должность, увольнение, снятие с должности работников, перевод в другую бригаду;

создание новых и расформирование старых бригад;

выписывание лесобилетов у лесничества;

выдача делянок бригадам;

приём делянок у бригад;

возвращение делянок лесничеству;

привоз леса бригадой на базу;

выдача плана цеховым бригадам;

получение леса бригадирами на базе;

сдача продукции на склад;

добавление и удаление фирм-клиентов;

получение заказа от фирмы-клиента;

продажа продукции.



Общий вид накладных и других документов



Лесобилет №_____

Лесничество «____________» Предприятие «____________»

Заведующий делянками ____________



Делянка №

Квадрат

Площадь, 

Порода древесины

Кол-во, куб. м.

1

13,36

6000

сосна

50







ель

120







берёза

35

2

Т.д.









«____»___________200 г.



Накладная на возврат делянки №___ лесничеству «____________» №___ от ______



Заведующий делянками ___________



номер делянки

Квадрат

Площадь, 

1

13,36

6000



Накладная на заказ товара №___ от ____



Фирма-заказчик __________Начальник сбыта __________



Адрес фирмы __________



Телефон __________



Наименование

Ед. измерения

Цена

Кол-во

Стоимость

Товар1

пог. м.









Срок выполнения заказа_____

Всего на сумму _______



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



 Подготовка отчёт о штате сотрудников по форме:


Таб. №

ФИО

Адрес

Телефон

Дата приёма на работу

Таб. № бригады

Должность

Дата назначения на должность



















Подготовка отчёта о наличии товара на складе по форме:



Кладовщик ______________

Наименование

Ед. измерения

Цена

Кол-во

Стоимость













Всего на сумму __________



Подготовка отчёта об ассортименте товара по форме:



Наименование

Ед. измерения

Цена



Подготовка отчёта о поставках товара фирмам-клиентам по форме:



Название фирмы «_____________»



Адрес



Телефон Срок поставок с___ по ___



Наименование

Ед. измерения

Цена

Кол-во

Стоимость













Всего на сумму: _________

Подготовка плана работы цеховым бригадам по форме:

План работы № __



Бригада №___Начальник сбыта ____________



Бригадир ___________Дата ____ Срок выполнения, дней ____



Наименование

Ед. измерения

Кол-во




II Концептуальное проектирование



1. Типы сущности



Выделим следующие типы сущностей:

древесина;

лесобилет;

делянка;

работник;

бригада;

бригадир;

зав. делянками;

нач. базы;

продукция (товар);

зав. складом

нач. сбыта;

фирма-клиент;

телефон;

накладная на возврат делянки лесничеству;

накладная на заказ товара;

накладная на продажу товара;

план работы цеховой бригады;



Типы сущностей



Наименование

Краткое описание

Синонимы

Особенности

древесина

сырьё для продукции

лес, сырьё





лесобилет

документ, который выдаётся лесничеством



нумерация лесобилетов ведётся в рамках текущего года

делянка

место в лесополосе, где предприятию разрешено выпиливание леса

участок

делянки могут возвращаться лесничеству по одной по мере выпиливания в них леса

работник

общее наименование для всех работающих на предприятии



каждый работник входит в состав какой-либо бригады, кроме нач. базы, зав. складом, зав. делянками и нач. сбыта

бригада

основное рабочее звено предприятия



каждая бригада выполняет только определённые виды работ

бригадир

работник, возглавляющий бригаду

начальник

в каждой бригаде обязательно есть бригадир

зав. делянками

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



эту должность занимает только один работник

нач. базы

работник, который принимает лес и выдаёт лес цеховым бригадам



--//--

зав. складом

работник, который принимает готовую продукцию у цеховых бригад и выдаёт её фирмам- клиентам

кладовщик

--//--

нач. сбыта

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



--//--

продукция

совокупность изделий, которые выпускает предприятие

товар

вся продукция хранится на одном складе, может иметь одинаковое наименование, но разную цену

фирма-клиент

фирмы, которые осуществляют заказ и покупку продукции

фирма-покупатель, фирма-заказчик

делает заказ на продукцию, однако если таковая имеется на складе, может приобрести её сразу

телефон

средство сообщения между лесничеством, фирмами-клиентами и руководящими работниками, а также работников между собой



фирмы-клиенты и работники могут иметь несколько номеров телефонов

накладная на возврат делянки лесничеству

документ, который свидетельствует, что лесничество приняло делянку у предприятия (зав. делянками)



нумерация накладных ведётся в рамках года

накладная на заказ товара

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

бланк заказа

--//--

накладная на продажу товара

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



нумерация накладных ведётся в рамках года

план работы цеховой бригады

график работы бригады

график работы

выдаётся цеховым бригадам



2. Типы связей



Определим типы связей:

работник приписан к бригаде;

бригаду возглавляет бригадир;

зав. делянками выписывает лесобилет;

лесобилет содержит делянку;

древесина указана для делянки;

зав. делянки оформляет накладную на возврат делянки лесничеству;

накладная на возврат делянки лесничеству содержит делянку;

делянка закреплена за бригадиром;

древесина имеется у бригадира;

лес хранится у начальника базы;

начальник сбыта оформляет накладную на заказ;

фирма-клиент выписывает накладную на заказ;

продукция входит в накладную на заказ;

начальник сбыта выдаёт план работы;

бригадир получает план работы;

продукция входит в план работы;

бригадир сдаёт продукцию;

продукция хранится у зав. складом;

зав. складом оформляет накладную на продажу;

фирма-клиент выписывает накладную на продажу;

продукция входит в накладную на продажу;

фирма-клиент имеет телефон;

работник имеет телефон.



Типы связей



Тип сущности

Тип связи

Тип сущности

Кардинальность

Степень участия

древесина

указана для

делянка

M:N

Т:Т

зав. делянками

выписывает

лесобилет

1:М

Т:Т

делянка

входит в 

лесобилет

M:1

Т:Т

зав. делянками

оформляет

накладная на возврат делянки лесничеству

1:М

Т:Т

делянка

входит в

накладная на возврат делянки лесничеству

M:1

Т:Т

делянка

закреплена за

бригадир

1:1

Т:Р

работник

приписан к

бригада

М:1

T:Т

бригадир

возглавляет

бригада

1:1

Т:Т

древесина

имеется у

бригадир

М:N

Т:Р

древесина

хранится у

нач. базы

М:1

P:Т

бригадир

сдаёт

продукция

M:N

Р:Т

продукция

хранится у

зав. складом

М:1

P:Т

фирма-клиент

выписывает

накладная на заказ

1:М

Т:Т

нач. сбыта

оформляет

накладная на заказ

1:М

Т:Т

продукция

входит в

накладная на заказ

1:М

Т:Т

фирма-клиент

выписывает

накладная на продажу

1:М

Т:Т

зав. складом

оформляет

накладная на продажу

1:М

Т:Т

продукция

входит в

накладная на продажу

1:М

Т:Т

нач. сбыта

выдаёт

план работы

1:М

Т:Т

бригада

получает

план работы

1:М

Р:Т

продукция

входит в

план работы

1:М

Т:Т

работник

имеет

телефон

М:1

P:Т

фирма-клиент

имеет

телефон

М:1

P:Т



3. Атрибуты



Тип сущности/

связи

Атрибут

Описание

Тип данных

Значение по умолчанию

Допустимость Null

Производный, множестве-нный

древесина

порода

порода деревьев

символьный

-

нет

множ

Лесо-билет

номер



целый

-

нет

-



дата

дата выписки

дата

-

нет

-

делянка

номер



целый

-

нет

-



квадрат

Местопол-ожение

символьный

-

нет

-



площадь



плав-щий

-

нет

-

работник

таб. номер



целый

-

нет

-



ФИО

фамилия, имя, отчество

символьный

-

нет

-



адрес

адрес места жительства

символьный

-

нет

-



телефон



символьный

-

да

множ



дата поступления

дата приёма на работу

дата

-

нет

-

зав. делянками

те же, что у работника +













дата назначения

дата назначения на должность

дата

-

нет

-

нач. базы

те же, что у зав. делянками











зав. складом

те же, что у зав. делянками











нач. сбыта

те же, что у зав. делянками











бригада

таб. номер



целый

-

нет

-



специализация

место работы бригады

символьный

-

нет

-



номер цеха

цех, в котором работает бригада

целый

да

-



бригадир

те же, что у работника +













дата назначения

дата назначения на должность

дата

-

нет

-

продукция

наименование



символьный

-

нет

-



цена



плав-щий

-

нет

-



ед. измер-я



символьный

-

нет

-

фирма-клиент

наименование



символьный

-

нет

-



адрес

юридический адрес фирмы

символьный

-

нет





телефон



символьный

-

да

множ

накладная на возврат делянки лесниче-ству

номер



целый

-

нет

-



дата

дата выписки

дата

-

нет

-

накладная на заказ товара

номер



целый

-

нет

-



дата

даты выписки

дата

-

нет

-



срок



срок выполнения заказа

целый



-



нет



-



Накладная на продажу

номер



целый

-

нет

-



дата

дата выписки

дата

-

нет

-

план работы цеховой бригады

те же, что у накладной на заказ+













объём

общий объём древесины, необходимый для выполнения плана

плав-щий

-

нет

-

хранится у

кол-во

кол-во древесины у нач. базы, у зав. складом

плав-щий

-

нет

-

сдаёт

кол-во

кол-во продукции, которую сдаёт бригадир зав. складом

плав-щий

-

нет

-

имеется у

кол-во

кол-во древесины, которое имеется у бригадира

плав-щий

-

нет

-

указана для

кол-во

кол-во древесины на делянке

плав-щий

-

нет

-




4. Домены атрибутов



Домен

Атрибуты

Тип данных

Ограничения

Примеры значений

порода

порода

символьный(20)



берёза

номер

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

целый

>0

1024

специализация

специализация бригады

символьный(20)



заготовительная

дата

дата выдачи лесобилета, накладной на возврат делянки лесничеству, плана работы, дата оформления накладной на заказ и продажу, дата поступления на работу и назначения на должность

дата

>01.01.2000 и

<01.01.2020

03.12.2002

срок

срок выполнения плана работы или заказа

целый

>0 и <30

14

объём

объём древесины в плане работы

плавающий

>0

35,5

квадрат

квадрат

символьный(5)



10*15

площадь

площадь

плавающий

>0

10000,5

таб. номер

таб. номер работников, бригадиров, бригад, зав. делянками, нач. базы, зав. склада, нач. сбыта

целый

>0

1251

название

ФИО, название фирмы-клиента, наименование товара

символьный(40)



Лебедев Алексей Леонидович

цена

цена

плавающий

>0

123,5

единицы измерения

единицы измерения вида товара

символьный(10)



кв.м.

адрес

адрес работников, бригадиров, бригад, зав. делянками, нач. базы, зав. склада, нач. сбыта, фирм-клиентов

символьный(50)



г. Калуга ул. Новаторская д.12 кв.6

телефон

телефон работников, бригадиров, бригад, зав. делянками, нач. базы, зав. склада, нач. сбыта, фирм-клиентов

символьный(10)



57-16-01

количество

кол-во древесины у нач. базы, у зав. складом,

кол-во продукции, которую сдаёт бригадир зав. складом,

кол-во древесины, которое имеется у бригадираБ

кол-во древесины на делянке

плавающий

>0

125,3




5. Определение потенциальных ключей и выбор среди них первичных



Тип сущности

Первичный ключ

Альтернативные ключи

древесина

порода



лесобилет

номер



делянка

номер

квадрат, площадь

работник

бригадир

зав. делянками

нач. базы

зав. складом

нач. сбыта

таб. номер

ФИО, адрес

бригада

номер



продукция

наименование, цена



фирма-клиент

название, адрес



накладная на возврат делянки лесничеству, накладная на заказ и на продажу, план работы

номер



телефон

номер






6. Построение ER-модели








III Логическое проектирование



1. Приведение концептуальной модели в соответствие с требованиями реляционной модели данных



1.1 Удаление связей типа M:N и связей с атрибутами



Связи «Древесина имеется у Бригадир» и «Древесина хранится у Нач. базы» заменяем на тип сущности «Наличие» с наследуемыми атрибутами «Таб. номер» и «Порода» и с собственным атрибутом «Количество» и типы связей «Древесина имеется в Наличие», «Нач. базы имеет в Наличие», «Бригадир имеет в Наличие».

Связь «Древесина указана для Делянка» заменяем на тип сущности «Наличие древесины» с наследуемыми атрибутами «Порода» и «Номер» и собственным атрибутом «Количество» и типы связей «Древесина характеризует Наличие древесины» и «Наличие древесины указано для Делянка»

Связь «Продукция хранится у Зав. складом» заменяем на тип сущности «Хранение» с наследуемыми атрибутами «Наименование» и «Цена» и собственным атрибутом «Количество» и типы связей «Продукция имеется на Хранение» и «Зав. складом имеет на хранение»

Связи «Входит в», связывающие сущности «Продукция» и «Накладная на заказ», «Накладная на продажу» и «План работы» заменяем на типы сущности «Строка накладной на заказ», «Строка накладной на продажу» и «Строка плана работы», типы связей «Продукция входит в Строка накладной на заказ», «Продукция входит в Строка накладной на продажу», «Продукция входит в План работы»; «Накладная на заказ содержит Строка накладной на заказ», «Накладная на продажу содержит Строка накладной на продажу» и «План работы содержит Строка плана работы» соответственно. При этом типы сущности «Строка накладной на заказ», «Строка накладной на продажу» и «Строка плана работы» наследуют атрибуты «Номер», «Наименование», «Цена» и имеют собственный атрибут «Количество». 

Связи «Лесобилет содержит Делянка» и «Накладная на возврат делянки лесничеству содержит Делянка» заменяем на два типа сущности «Строка лесобилета» и «Строка накладной на возврат делянки лесничеству» с наследуемыми атрибутами «Номер лесобилета», «Номер накладной» и «Номер делянки» и типы связей «Лесобилет содержит Строка лесобилета» и «Накладная на возврат делянки лесничеству содержит Строка накладной на возврат делянки лесничеству»; «Делянка входит в Строка лесобилета» и «Делянка входит в Строка накладной на возврат делянки лесничеству» соответственно.

Связь «Бригадир сдаёт Продукция» заменяем на тип сущности «Объём товара» с наследуемыми атрибутами «Таб. номер», «Наименование» и «Цена» и типы связей «Продукция входит в Объём товара» и «Бригадир выпускает Объём товара»



Скорректированная таблица «Типы сущностей»

Наименование

Краткое описание

Синонимы

Особенности

древесина

сырьё для продукции

лес, сырьё





лесобилет

документ, который выдаётся лесничеством



нумерация лесобилетов ведётся в рамках текущего года

делянка

место в лесополосе, где предприятию разрешено выпиливание леса

участок

делянки могут возвращаться лесничеству по одной по мере выпиливания в них леса

работник

общее наименование для всех работающих на предприятии



каждый работник входит в состав какой-либо бригады, кроме нач. базы, зав. складом, зав. делянками и нач. сбыта

бригада

основное рабочее звено предприятия



каждая бригада выполняет только определённые виды работ

бригадир

работник, возглавляющий бригаду

начальник

в каждой бригаде обязательно есть бригадир

зав. делянками

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



эту должность занимает только один работник

нач. базы

работник, который принимает лес и выдаёт лес цеховым бригадам



--//--

зав. складом

работник, который принимает готовую продукцию у цеховых бригад и выдаёт её фирмам- клиентам

кладовщик

--//--

нач. сбыта

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



--//--

продукция

совокупность изделий, которые выпускает предприятие

товар

вся продукция хранится на одном складе, может иметь одинаковое наименование, но разную цену

фирма-клиент

фирмы, которые осуществляют заказ и покупку продукции

фирма-покупатель, фирма-заказчик

делает заказ на продукцию, однако если таковая имеется на складе, может приобрести её сразу

телефон

средство сообщения между лесничеством, фирмами-клиентами и руководящими работниками, а также работников между собой



фирмы-клиенты и работники могут иметь несколько номеров телефонов

накладная на возврат делянки лесничеству

документ, который свидетельствует, что лесничество приняло делянку у предприятия (зав. делянками)



нумерация накладных ведётся в рамках года

накладная на заказ товара

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

бланк заказа

--//--

накладная на продажу товара

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



нумерация накладных ведётся в рамках года

план работы цеховой бригады

график работы бригады на неделю

график работы

выдаётся цеховым бригадам

наличие древесины

порода древесины и её количество на делянке

-

-

наличие

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

-

-

объём товара

количество и вид продукции, которое имеет в наличии бригадир





хранение

количество продукции на хранении у зав. складом





строка лесобилета







строка накладной на возврат делянки лесничеству







строка плана работы 







строка накладной на заказ







строка накладной на продажу







Скорректированная таблица «Типы связей»

Тип сущности

Тип связи

Тип сущности

Кардинальность

Степень участия

наличие древесины

указано для

делянка

M:1

Т:Т

древесина

характеризует

наличие древесины

1:M

T:T

зав. делянками

выписывает

лесобилет

1:М

Т:Т

лесобилет

содержит

строка лесобилета

1:М

Т:Т

делянка

входит в 

строка лесобилета

1:1

Т:Т

зав. делянками

оформляет

накладная на возврат делянки лесничеству

1:М

Т:Т

накладная на возврат делянки лесничеству

содержит

строка накладной на возврат делянки лесничеству

1:М

Т:Т

делянка

входит в

строка накладной на возврат делянки лесничеству

1:1

Т:Т

делянка

закреплена за

бригадир

1:1

Т:Р

работник

приписан к

бригада

М:1

T:Т

бригадир

возглавляет

бригада

1:1

Т:Т

бригадир

имеет в

наличие

1:М

Р:Т

нач. базы

имеет в

наличие

1:М

Т:Т

древесина

имеется в

наличие

1:М

Р:Т

бригадир

выпускает

объём товара

1:М

Р:Т

продукция 

входит в

объём товара

1:М

Т:Т

продукция

имеется на

хранение

М:1

Р:Т

зав. складом

имеет на

хранение

1:1

Т:Т

фирма-клиент

выписывает

накладная на заказ

1:М

Т:Т

нач. сбыта

оформляет

накладная на заказ

1:М

Т:Т

накладная на заказ

содержит

строка накладной на заказ

1:М

Т:Т

продукция

входит в

строка накладной на заказ

1:М

Т:Т

фирма-клиент

выписывает

накладная на продажу

1:М

Т:Т

зав. складом

оформляет

накладная на продажу

1:М

Т:Т

накладная на продажу

содержит

строка накладной на продажу

1:М

Т:Т

продукция

входит в

строка накладной на продажу

1:М

Т:Т

нач. сбыта

выдаёт

план работы

1:М

Т:Т

план работы

содержит

строка плана работы

1:М

Т:Т

продукция

входит в

строка плана работы

1:М

Т:Т

бригада

получает

план работы

1:М

Р:Т

работник

имеет

телефон

М:1

P:Т

фирма-клиент

имеет

телефон

М:1

T:Т



Ключи

Тип сущности

Первичный ключ

Альтернативные ключи

древесина

порода



лесобилет

номер



делянка

номер

квадрат, площадь

работник

бригадир

зав. делянками

нач. базы

зав. складом

нач. сбыта

таб. номер

ФИО, адрес

бригада

таб. номер



продукция

наименование, цена



фирма-клиент

название, адрес



накладная на возврат делянки лесничеству, накладная на заказ и на продажу, план работы

номер



телефон

номер



наличие 

слабая сущность

хранение

слабая сущность

строка лесобилета

слабая сущность

строка накладной на возврат делянки лесничеству

слабая сущность

объём товара

слабая сущность

строка накладной на заказ

слабая сущность

строка накладной на продажу

слабая сущность

строка плана работы

слабая сущность

наличие древесины

слабая сущность



2. Построение скорректированной ER – модели







3. Определение наборов отношений



		Фирма-клиент (название, адрес, номер телефона)

ПК: название, адрес

ВК: нет

	Древесина (порода)

ПК: порода

ВК: нет

	Делянка (номер, квадрат, площадь)

		ПК: номер

		ВК: нет

	Работник (таб. номер, ФИО, адрес, телефон, дата поступления, дата назначения, должность, номер бригады)

		ПК: таб. номер

		ВК: номер бригады ссылается на бригада (номер)

	Бригадир (таб. номер, ФИО, адрес, телефон, дата поступления, дата назначения, номер бригады)

		ПК: таб. номер

		ВК: номер бригады ссылается на бригада (номер)

	Бригада (номер, специализация, номер цеха)

		ПК: номер

		ВК: нет

	Продукция (наименование, цена, единицы измерения)

		ПК: наименование, цена

		ВК: нет

	Телефон (номер, название фирмы-клиента, адрес фирмы-клиента, таб. номер работника)

		ПК: номер

		ВК: название фирмы-клиента, адрес фирмы-клиента ссылается на фирма-клиент (название, адрес)

		ВК: таб. номер работника ссылается на работник (таб. номер)

	Накладная на заказ (номер, дата, срок, таб. номер нач. сбыта, название фирмы-клиента, адрес фирмы-клиента, номер телефона фирмы-клиента)

		ПК: номер

		ВК: название фирмы-клиента, адрес фирмы-клиента ссылается на фирма-клиент (название, адрес)

		ВК: таб. номер начальника сбыта ссылается на работник(таб. номер)

	Строка накладной на заказ (кол-во, наименование продукции, цена продукции, номер накладной)

		ПК: номер накладной, наименование продукции, цена продукции

		ВК: номер накладной ссылается на накладная на заказ (номер)

		ВК: наименование продукции, цена продукции ссылается на продукция (наименование, цена)

	Накладная на продажу (номер, дата, таб. номер зав. складом, название фирмы-клиента, адрес фирмы-клиента, номер телефона фирмы-клиента)

		ПК: номер

		ВК: название фирмы-клиента, адрес фирмы-клиента ссылается на фирма-клиент(название, адрес)

		ВК: таб. номер зав. складом ссылается на работник(таб. номер)

	Строка накладной на продажу(кол-во, наименование продукции, цена продукции, номер накладной)

		ПК: номер накладной, наименование продукции, цена продукции

		ВК: номер накладной ссылается на накладная на продажу(номер)

		ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

	План работы(номер, дата, срок, объём древесины, таб. номер нач. сбыта, номер бригады)

		ПК: номер

		ВК: таб. номер начальника сбыта ссылается на работник(таб. номер)

		ВК: номер бригады ссылается на бригада(номер)

	Строка плана работы(кол-во, наименование продукции, цена продукции, номер плана)

		ПК: номер плана, наименование продукции, цена продукции

		ВК: номер плана ссылается на план работы(номер)

		ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

	Объём товара(кол-во, таб. номер бригадира, наименование продукции, цена продукции)

		ПК: таб. номер бригадира, наименование продукции, цена продукции

		ВК: таб. номер бригадира ссылается на работник(таб. номер)

		ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

	Наличие древесины(кол-во, порода, номер делянки)

		ПК: номер делянки, порода

		ВК: номер делянки ссылается на делянка(номер)

		ВК: порода ссылается на древесина(порода)

	Лесобилет(номер, таб. номер зав. делянками, дата)

		ПК: номер

		ВК: таб. номер зав. делянками ссылается на работник(таб. номер)

	Строка лесобилета(номер лесобилета, номер делянки)

		ПК: номер лесобилета, номер делянки

		ВК: номер лесобилета ссылается на лесобилет(номер)

		ВК: номер делянки ссылается на делянка(номер)

	Накладная на возврат делянки лесничеству(номер, таб. номер зав. делянками, дата)

		ПК: номер

		ВК: таб. номер зав. делянками ссылается на работник(таб. номер)

	Строка накладной на возврат делянки лесничеству(номер накладной, номер делянки)

		ПК: номер накладной, номер делянки

		ВК: номер накладной ссылается на накладная на возврат делянки лесничеству(номер)

		ВК: номер делянки ссылается на делянка(номер)

	Наличие(таб. номер бригадира, таб.номер нач. базы, порода, кол-во)

		ПК: таб. бригадира, таб.номер нач. базы, порода

		ВК: таб. номер бригадира ссылается на бригадир(таб. номер)

		ВК: таб. номер нач. базы ссылается на работник(таб. номер)

	ВК: порода ссылается на древесина(порода)

Хранение(таб. номер зав. складом, наименование продукции, цена продукции, кол-во)

	ПК: наименование продукции, цена продукции

	ВК: таб. номер зав. складом ссылается на работник(таб. номер)

	ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)



4. Проверка набора отношений на соответствие требованиям нормализации



Для каждого из отношений выпишем функциональные зависимости.

		Фирма-клиент

название, адрес – номер телефона

		Древесина

порода – 

		Делянка

номер – квадрат

номер – площадь

		Работник

таб. номер – ФИО

таб. номер – адрес

таб. номер – телефон

таб. номер – дата поступления

таб. номер – дата назначения

таб. номер – должность

таб. номер – номер бригады

		Бригадир

таб. номер – ФИО

таб. номер – адрес

таб. номер – телефон

таб. номер – дата поступления

таб. номер – дата назначения

таб. номер – номер бригады

		Бригада

номер – специализация

номер – номер цеха

		Продукция

наименование, цена – единицы измерения

		Телефон

номер – название фирмы-клиента

номер – адрес фирмы-клиента

номер – таб. номер работника

		Накладная на заказ

номер – дата

номер – срок

номер – таб. номер начальника сбыта

номер – название фирмы-клиента

номер – адрес фирмы-клиента

номер – телефон фирмы-клиента

		Строка накладной на заказ

номер накладной, наименование продукции, цена продукции – количество

		Накладная на продажу

номер – дата

номер – таб. номер зав. складом

номер – название фирмы-клиента

номер – адрес фирмы-клиента

номер – телефон фирмы-клиента

		Строка накладной на продажу

номер накладной, наименование продукции, цена продукции – количество

		План работы

номер – дата

номер – срок

номер – таб. номер нач. сбыта

номер – номер бригады

		Строка плана работы

номер плана, наименование продукции, цена продукции – количество

номер плана, наименование продукции, цена продукции – объём древесины

		Объём товара

таб. номер бригадира, наименование продукции, цена продукции – количество

		Наличие древесины

номер делянки, порода – количество

		Лесобилет

номер – таб. номер зав. делянками

номер – дата

		Строка лесобилета

номер лесобилета, номер делянки – 

		Накладная на возврат делянки лесничеству

номер – таб. номер зав. делянками

номер – дата

		Строка накладной на возврат делянки лесничеству

номер накладной, номер делянки

		Наличие

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



		Хранение

таб. номер зав. складом, наименование продукции, цена продукции – количество



5. Проверка модели на возможность выполнения всех транзакций



Для каждой транзакции на ER-модели обозначим путь её выполнения. 






6. Построение окончательного варианта ER – модели



ER–модель, изображённую в пункте 2 логического проектирования будет окончательным вариантом, т.к. пунктах 3 -5 ER – модель не претерпела никаких изменений.



7. Определение набора ограничений целостности



1 Обязательные данные. К ним относятся все атрибуты, составляющие первичные ключи + ещё некоторые атрибуты, которые по постановке задачи или из смысловых соображений не могут быть пустыми (см. таблицу «Атрибуты» и таблицу ниже).



Тип сущности/

связи

Атрибут

Описание

Тип данных

строка накладной на заказ

количество

количество товара

плавающий

строка накладной на продажу

количество

количество товара

плавающий

строка плана работы

количество

количество товара

плавающий

хранение

кол-во

кол-во продукции у зав. складом

плавающий

наличие

кол-во

кол-во древесины у бригадира или нач. базы

плавающий

объём товара

кол-во

кол-во продукции, которое имеется у бригадира

плавающий

наличие древесины

кол-во

кол-во древесины на делянке

плавающий



2 Ограничение доменов атрибутов 

См. таблицу доменов.

3 Ограничение ссылочной целостности

Для всех внешних ключей определим действие на случай удаления или изменения родительских записей.

	Работник

	ВК: номер бригады ссылается на бригада(номер)

	при изменении CASCADE, при удалении NO ACTION

	Бригадир

	ВК: номер бригады ссылается на бригада(номер)

	при изменении CASCADE, при удалении NO ACTION

	Телефон

	ВК: название фирмы-клиента, адрес фирмы-клиента ссылается на фирма-клиент(название, адрес)

	при изменении CASCADE, при удалении CASCADE

	ВК: таб. номер работника ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении CASCADE

	Накладная на заказ

	ВК: название фирмы-клиента, адрес фирмы-клиента ссылается на фирма-клиент(название, адрес)

	при изменении NO ACTION, при удалении NO ACTION

	ВК: таб. номер начальника сбыта ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении NO ACTION

	Строка накладной на заказ

	ВК: номер накладной ссылается на накладная на заказ(номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

	при изменении NO ACTION, при удалении NO ACTION

	Накладная на продажу

	ВК: название фирмы-клиента, адрес фирмы-клиента ссылается на фирма-клиент(название, адрес)

	при изменении NO ACTION, при удалении NO ACTION

	ВК: таб. номер зав. складом ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении NO ACTION

	Строка накладной на продажу

	ВК: номер накладной ссылается на накладная на продажу(номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

	при изменении NO ACTION, при удалении NO ACTION

	План работы

	ВК: таб. номер начальника сбыта ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: номер бригады ссылается на бригада(номер)

	при изменении CASCADE, при удалении NO ACTION

	Строка плана работы

	ВК: номер плана ссылается на план работы(номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

	при изменении NO ACTION, при удалении NO ACTION

	Объём товара

	ВК: таб. номер бригадира ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

	при изменении NO ACTION, при удалении NO ACTION

	Наличие древесины

	ВК: номер делянки ссылается на делянка(номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: порода ссылается на древесина(порода)

	при изменении NO ACTION, при удалении NO ACTION

	Лесобилет

	ВК: таб. номер зав. делянками ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении NO ACTION

	Строка лесобилета

	ВК: номер лесобилета ссылается на лесобилет(номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: номер делянки ссылается на делянка(номер)

	при изменении CASCADE, при удалении NO ACTION

	Накладная на возврат делянки лесничеству

	ВК: таб. номер зав. делянками ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении NO ACTION

	Строка накладной на возврат делянки лесничеству

	ВК: номер накладной ссылается на накладная на возврат делянки лесничеству(номер)

	при изменении CASCADE, при удалении NO ACTION

	ВК: номер делянки ссылается на делянка(номер)

	при изменении CASCADE, при удалении NO ACTION

	Наличие

	ВК: таб. номер работника ссылается на работник(таб. номер)

	при изменении CASCADE, при удалении NO ACTION

ВК: порода ссылается на древесина(порода)

при изменении NO ACTION, при удалении NO ACTION

Хранение

ВК: таб. номер зав. складом ссылается на работник(таб. номер)

при изменении CASCADE, при удалении NO ACTION

ВК: наименование продукции, цена продукции ссылается на продукция(наименование, цена)

при изменении NO ACTION, при удалении NO ACTION


4 Бизнес правила



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


IV Физическое проектирование



1. Введение контролируемой избыточности



1. Замена ПК семантически незначащими атрибутами



Т.к. значение первичного ключа «Таб. номер» для типа экземпляра сущности «Работник» освобождается, например, при увольнении работника, но в качестве внешнего ключа может встречаться в одной или нескольких дочерних таблицах, то были введён суррогатный ключ «Условный номер» и новый атрибут «Уволен» для логического удаления работника.

Чтобы не отслеживать уникальность первичного ключа в таблицах «Работник» и «Бригадир», они были объединены в одну таблицу «Работник». В то же время, для уменьшения объёма таблицы «Работник» совокупность значений атрибута «Должность» было выделено в отдельную таблицу «Должность» с полями «Условный номер», «Название» и «Занята». Последнее поле служит для контроля выполнения бизнес-правил.

Те же действия были проведены и в отношении типа сущности «Бригада».

Для таблиц «Фирма-клиент» и «Продукция» также были введены суррогатные ключи «Условный номер» и атрибут «Удалён» для повышения скорости выполнения запросов и логического удаления кортежей отношений. 

Для таблиц «План работы», «Делянка» были введены дополнительные атрибуты «Выполнен» и «Выпилена» для контроля выполнения бизнес-правил.

В таблице «Древесина» первичный ключ «Порода» был заменён на суррогатный «Условный номер» для уменьшения объёма дочерних таблиц.

В таблице «Хранение» ввиду своей бесполезности был удалён внешний ключ «Таб. номер зав. складом».


2 Создание таблиц и реализация ограничений



Создание таблиц и реализация ограничений, в соответствие с ранее определённым набором отношений, при помощи выбранной СУБД. В качестве СУБД выберем InterBase 6.0.

Скрипты создания таблиц

Замечание: различного рода ограничения реализуются с помощью доменов, триггеров и хранимых процедур.



CREATE TABLE "Brigada" (

 "Usl_nomer" INTEGER NOT NULL,

 "Specialisacia" VARCHAR(20) NOT NULL,

 "Nomer_Ceha" INTEGER,

 "N_Brigada" INTEGER NOT NULL,

 "Uv" "Bool" NOT NULL);



ALTER TABLE "Brigada" ADD CONSTRAINT "FK_Brigada" PRIMARY KEY ("Usl_nomer");



CREATE TABLE "Delanka" (

 "Numer" "Nomer",

 "Kvadrat" VARCHAR(5) NOT NULL,

 "Plotschad" DOUBLE PRECISION NOT NULL,

 "NBrigadir" INTEGER,

 "Isp" SMALLINT DEFAULT 0 NOT NULL);



ALTER TABLE "Delanka" ADD CONSTRAINT "FK_Delanka" PRIMARY KEY ("Numer");


ALTER TABLE "Delanka" ADD CONSTRAINT "FK_N_Brigadir_Delanka" FOREIGN KEY ("NBrigadir") REFERENCES "Rabotnik" ("Usl_nomer") ON DELETE CASCADE ON UPDATE CASCADE;



CREATE TABLE "Dolgnost" (

 "Zanata" "Bool",

 "N_Dolgn" INTEGER NOT NULL,

 "Name_Dolgn" VARCHAR(20) NOT NULL COLLATE PXW_CYRL);



ALTER TABLE "Dolgnost" ADD CONSTRAINT "FK_Dolgnost" PRIMARY KEY ("N_Dolgn");



CREATE TABLE "Drevesina" (

 "Poroda" VARCHAR(20) NOT NULL,

 "Usl_nomer" INTEGER NOT NULL);



ALTER TABLE "Drevesina" ADD CONSTRAINT "FK_Drevesina" PRIMARY KEY ("Usl_nomer");



CREATE TABLE "Hranenie" (

 "N_Produkcia" INTEGER NOT NULL,

 "Kolvo" DOUBLE PRECISION NOT NULL);



ALTER TABLE "Hranenie" ADD CONSTRAINT "FK_Hranenie" PRIMARY KEY ("N_Produkcia");

ALTER TABLE "Hranenie" ADD CONSTRAINT "FK_N_Produkcia_Hranenie" FOREIGN KEY ("N_Produkcia") REFERENCES "Produkcia" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Klient" (

 "Usl_nomer" INTEGER NOT NULL,

 "Name" FIO COLLATE PXW_CYRL,

 "Adres" "Adress" COLLATE PXW_CYRL,

 "Uvolen" "Bool" NOT NULL);



ALTER TABLE "Klient" ADD CONSTRAINT "FK_Klient" PRIMARY KEY ("Usl_nomer");



CREATE TABLE "Lesobilet" (

 "Numer" "Nomer",

 "Data" DATE NOT NULL,

 "N_Zav_Delankami" INTEGER NOT NULL);



ALTER TABLE "Lesobilet" ADD CONSTRAINT "PK_Lesobilet" PRIMARY KEY ("Numer");



ALTER TABLE "Lesobilet" ADD CONSTRAINT "FK_N_Zav_Del_Lesobilet" FOREIGN KEY ("N_Zav_Delankami") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Naklad_Lesnichestvo" (

 "Numer" "Nomer",

 "Data" DATE NOT NULL,

 "N_Zav_Delankami" INTEGER NOT NULL);



ALTER TABLE "Naklad_Lesnichestvo" ADD CONSTRAINT "PK_Naklad_Lesnichestvo" PRIMARY KEY ("Numer");



ALTER TABLE "Naklad_Lesnichestvo" ADD CONSTRAINT "FK_N_Zav_Del_Naklad_Lesn" FOREIGN KEY ("N_Zav_Delankami") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Naklad_Prodaga" (

 "Data" DATE NOT NULL,

 "N_Firma" INTEGER NOT NULL,

 "Numer" "Nomer" NOT NULL,

 "N_Zav_Skladom" INTEGER NOT NULL);



ALTER TABLE "Naklad_Prodaga" ADD CONSTRAINT "PK_Naklad_Prodaga" PRIMARY KEY ("Numer");



ALTER TABLE "Naklad_Prodaga" ADD CONSTRAINT "FK_N_Firma_Nakl_Prodaga" FOREIGN KEY ("N_Firma") REFERENCES "Klient" ("Usl_nomer") ON UPDATE CASCADE;

ALTER TABLE "Naklad_Prodaga" ADD CONSTRAINT "FK_N_Zav_Skl_Naklad_Prodaga" FOREIGN KEY ("N_Zav_Skladom") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Naklad_Zakaz" (

 "Numer" "Nomer",

 "Data" DATE NOT NULL,

 "Srok" INTEGER NOT NULL,

 "N_Firma" INTEGER NOT NULL,

 "N_Nach_Sbita" INTEGER NOT NULL);



ALTER TABLE "Naklad_Zakaz" ADD CONSTRAINT "FK_Naklad_Zakaz" PRIMARY KEY ("Numer");



ALTER TABLE "Naklad_Zakaz" ADD CONSTRAINT "FK_N_Firma_Nakl_Zakaz" FOREIGN KEY ("N_Firma") REFERENCES "Klient" ("Usl_nomer") ON UPDATE CASCADE;

ALTER TABLE "Naklad_Zakaz" ADD CONSTRAINT "FK_N_Nach_Sbita_Nakl_Zakaz" FOREIGN KEY ("N_Nach_Sbita") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Nalichie" (

 "N_Brigadir" INTEGER,

 "N_Nach_Baza" INTEGER,

 "N_Drevesina" INTEGER NOT NULL,

 "Kolvo" INTEGER NOT NULL);



ALTER TABLE "Nalichie" ADD CONSTRAINT "FK_N_Brigadir" FOREIGN KEY ("N_Brigadir") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;

ALTER TABLE "Nalichie" ADD CONSTRAINT "FK_N_Drevesina_Nalichie" FOREIGN KEY ("N_Drevesina") REFERENCES "Drevesina" ("Usl_nomer") ON UPDATE CASCADE;

ALTER TABLE "Nalichie" ADD CONSTRAINT "FK_N_Nach_Bazi" FOREIGN KEY ("N_Nach_Baza") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Nalichie_Drevesina" (

 "N_Drevesina" INTEGER NOT NULL,

 "N_Delanka" INTEGER NOT NULL,

 "Kolvo" DOUBLE PRECISION NOT NULL);



ALTER TABLE "Nalichie_Drevesina" ADD CONSTRAINT "FK_Nalichie_Drevesina" PRIMARY KEY ("N_Drevesina", "N_Delanka");

ALTER TABLE "Nalichie_Drevesina" ADD CONSTRAINT "FK_N_Delanka_Nal_Drev" FOREIGN KEY ("N_Delanka") REFERENCES "Delanka" ("Numer") ON UPDATE CASCADE;

ALTER TABLE "Nalichie_Drevesina" ADD CONSTRAINT "FK_N_Drevesina_Nal_Drev" FOREIGN KEY ("N_Drevesina") REFERENCES "Drevesina" ("Usl_nomer") ON UPDATE CASCADE;

CREATE TABLE "Objem" (

 "N_Brigadir" INTEGER NOT NULL,

 "N_Produkcia" INTEGER NOT NULL,

 "Kolvo" DOUBLE PRECISION NOT NULL);



ALTER TABLE "Objem" ADD CONSTRAINT "FK_Objem" PRIMARY KEY ("N_Brigadir", "N_Produkcia");



ALTER TABLE "Objem" ADD CONSTRAINT "FK_N_Brigadir_Objem" FOREIGN KEY ("N_Brigadir") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;

ALTER TABLE "Objem" ADD CONSTRAINT "FK_N_Produkcia_Objem" FOREIGN KEY ("N_Produkcia") REFERENCES "Produkcia" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Plan" (

 "Numer" "Nomer",

 "Data" DATE NOT NULL,

 "Srok" INTEGER NOT NULL,

 "N_Brigada" INTEGER NOT NULL,

 "Objem_Drevesini" DOUBLE PRECISION NOT NULL,

 "Isp" SMALLINT DEFAULT 0 NOT NULL,

 "N_Nach_Sbita" INTEGER NOT NULL);

ALTER TABLE "Plan" ADD CONSTRAINT "FK_Plan" PRIMARY KEY ("Numer");



ALTER TABLE "Plan" ADD CONSTRAINT "FK_N_Brigada_Plan" FOREIGN KEY ("N_Brigada") REFERENCES "Brigada" ("Usl_nomer") ON UPDATE CASCADE;

ALTER TABLE "Plan" ADD CONSTRAINT "FK_N_Nach_Sbita_Plan" FOREIGN KEY ("N_Nach_Sbita") REFERENCES "Rabotnik" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Produkcia" (

 "Usl_nomer" INTEGER NOT NULL,

 "Name" FIO,

 "Cena" DOUBLE PRECISION NOT NULL,

 "Ed_Izm" VARCHAR(10) NOT NULL,

 "Old" SMALLINT DEFAULT 0 NOT NULL);



ALTER TABLE "Produkcia" ADD CONSTRAINT "FK_Produkcia" PRIMARY KEY ("Usl_nomer");



CREATE TABLE "Rabotnik" (

 "Usl_nomer" INTEGER NOT NULL,

 "Tab_numer" "Tab_nomer",

 "R_Fio" FIO COLLATE PXW_CYRL,

 "Adres" "Adress" COLLATE PXW_CYRL,

 "Data_Postup" DATE NOT NULL,

 "Data_Nazn" DATE,

 "Dolgnost" INTEGER,

 "N_Brigadi" INTEGER,

 "Uvolen" "Bool" NOT NULL);

ALTER TABLE "Rabotnik" ADD CONSTRAINT "FK_Rabotnik" PRIMARY KEY ("Usl_nomer");



ALTER TABLE "Rabotnik" ADD CONSTRAINT "FK_N_Brigada" FOREIGN KEY ("N_Brigadi") REFERENCES "Brigada" ("Usl_nomer") ON UPDATE CASCADE;

ALTER TABLE "Rabotnik" ADD CONSTRAINT "FK_N_Dolgnost" FOREIGN KEY ("Dolgnost") REFERENCES "Dolgnost" ("N_Dolgn") ON UPDATE CASCADE;



CREATE TABLE "Stroka_Lesn" (

 "N_Naklad_Lesn" INTEGER NOT NULL,

 "N_Delanka" INTEGER NOT NULL);



ALTER TABLE "Stroka_Lesn" ADD CONSTRAINT "FK_Stroka_Lesn" PRIMARY KEY ("N_Naklad_Lesn", "N_Delanka");



ALTER TABLE "Stroka_Lesn" ADD CONSTRAINT "FK_N_Delanka_Stroka_Lesn" FOREIGN KEY ("N_Delanka") REFERENCES "Delanka" ("Numer") ON UPDATE CASCADE;

ALTER TABLE "Stroka_Lesn" ADD CONSTRAINT "FK_N_Nakl_Lesn_Stroka_Lesn" FOREIGN KEY ("N_Naklad_Lesn") REFERENCES "Naklad_Lesnichestvo" ("Numer") ON UPDATE CASCADE;



CREATE TABLE "Stroka_Lesobilet" (

 "N_Lesobilet" INTEGER NOT NULL,

 "N_Delanka" INTEGER NOT NULL);



ALTER TABLE "Stroka_Lesobilet" ADD CONSTRAINT "FK_Stroka_Lesobilet" PRIMARY KEY ("N_Lesobilet", "N_Delanka");

ALTER TABLE "Stroka_Lesobilet" ADD CONSTRAINT "FK_N_Delanka_Str_Bilet" FOREIGN KEY ("N_Delanka") REFERENCES "Delanka" ("Numer") ON UPDATE CASCADE;

ALTER TABLE "Stroka_Lesobilet" ADD CONSTRAINT "FK_N_Lesobilet_Str_Bilet" FOREIGN KEY ("N_Lesobilet") REFERENCES "Lesobilet" ("Numer") ON UPDATE CASCADE;



CREATE TABLE "Stroka_Plana" (

 "N_Plan" INTEGER NOT NULL,

 "N_Produkcia" INTEGER NOT NULL,

 "Kolvo" DOUBLE PRECISION NOT NULL);



ALTER TABLE "Stroka_Plana" ADD CONSTRAINT "FK_Stroka_Plana" PRIMARY KEY ("N_Plan", "N_Produkcia");



ALTER TABLE "Stroka_Plana" ADD CONSTRAINT "FK_N_Plan_Stroka_Plana" FOREIGN KEY ("N_Plan") REFERENCES "Plan" ("Numer") ON UPDATE CASCADE;

ALTER TABLE "Stroka_Plana" ADD CONSTRAINT "FK_N_Produkcia_Stroka_Plana" FOREIGN KEY ("N_Produkcia") REFERENCES "Produkcia" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Stroka_Prodaga" (

 "N_Naklad_Prodaga" INTEGER NOT NULL,

 "N_Produkcia" INTEGER NOT NULL,

 "Kolvo" DOUBLE PRECISION NOT NULL);



ALTER TABLE "Stroka_Prodaga" ADD CONSTRAINT "FK_Stroka_Prodaga" PRIMARY KEY ("N_Naklad_Prodaga", "N_Produkcia");



ALTER TABLE "Stroka_Prodaga" ADD CONSTRAINT "FK_N_Produkcia_Str_Prod" FOREIGN KEY ("N_Produkcia") REFERENCES "Produkcia" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Stroka_Zakaz" (

 "N_Naklad_Zakaz" INTEGER NOT NULL,

 "N_Produkcia" INTEGER NOT NULL,

 "Kolvo" DOUBLE PRECISION NOT NULL);



ALTER TABLE "Stroka_Zakaz" ADD CONSTRAINT "FK_Stroka_Zakaz" PRIMARY KEY ("N_Naklad_Zakaz", "N_Produkcia");



ALTER TABLE "Stroka_Zakaz" ADD CONSTRAINT "FK_N_Nakl_Z_Stroka_Zakaz" FOREIGN KEY ("N_Naklad_Zakaz") REFERENCES "Naklad_Zakaz" ("Numer") ON UPDATE CASCADE;

ALTER TABLE "Stroka_Zakaz" ADD CONSTRAINT "FK_N_Produkcia_Stroka_Zakaz" FOREIGN KEY ("N_Produkcia") REFERENCES "rodukcia" ("Usl_nomer") ON UPDATE CASCADE;



CREATE TABLE "Telefon" (

 "Nomer" "Nomer_Tlf" NOT NULL,

 "N_Firma" INTEGER,

 "N_Rabotnik" INTEGER);



ALTER TABLE "Telefon" ADD CONSTRAINT "PK_Telefon" PRIMARY KEY ("Nomer");



ALTER TABLE "Telefon" ADD CONSTRAINT "FK_N_Rabotnik_Tlf" FOREIGN KEY ("N_Rabotnik") REFERENCES "Rabotnik" ("Usl_nomer") ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE "Telefon" ADD CONSTRAINT "FK_N_firma_Tlf" FOREIGN KEY ("N_Firma") REFERENCES "Klient" ("Usl_nomer") ON DELETE CASCADE ON UPDATE CASCADE;



3 Создание вторичных индексов



Для повышения производительности в таблицах «Работник», «Продукция», «Клиент» были созданы вторичные индексы.



Скрипты создания вторичных индексов



CREATE INDEX "Rabotnik_IDX1" ON "Rabotnik" ("R_Fio");

CREATE INDEX "Rabotnik_IDX2" ON "Rabotnik" ("Adres");



CREATE INDEX "Produkcia_IDX1" ON "Produkcia" ("Name");

CREATE INDEX "Produkcia_IDX2" ON "Produkcia" ("Cena");



CREATE UNIQUE INDEX "Klient_IDX1" ON "Klient" ("Name");

CREATE INDEX "Klient_IDX2" ON "Klient" ("Adres");



4 Права доступа



Транзакции 1,2 выполняет отдел кадров

Транзакции 3-6 - зав. делянками

Транзакции 9,7 - нач. базы

Транзакции 8,11,12 - нач. сбыта

Транзакции 10,13 - зав. складом



Приведем примеры таблиц и хранимых процедур.

Листинг процедуры добавления накладной на заказ товара

procedure TDob_Nakl_Zakaz.Button1Click(Sender: TObject);

var i,j:Integer;

 Ok:Boolean;

begin

 Ok:=False;

 if(not DM4.IBTrans_Write.Active)

 then DM4.IBTrans_Write.StartTransaction;

 j:=0;

 if((StringReplace(MaskEdit1.EditText,' ','',[rfReplaceAll])<>'') and

 (StringReplace(MaskEdit2.EditText,' ','',[rfReplaceAll])<>''))

 then

 begin

 DM4.IBSP_Dob_Nakl_Z.ParamByName('Name').AsString:=

 ComboBox1.Text;

 DM4.IBSP_Dob_Nakl_Z.ParamByName('Adres').AsString:=

 Edit2.Text;

 DM4.IBSP_Dob_Nakl_Z.ParamByName('Nomer').AsInteger:=

 StrToInt(StringReplace(MaskEdit1.Text,' ','',[rfReplaceAll]));

 DM4.IBSP_Dob_Nakl_Z.ParamByName('Srok').AsInteger:=

 StrToInt(StringReplace(MaskEdit2.Text,' ','',[rfReplaceAll]));

 DM4.IBSP_Dob_Nakl_Z.ParamByName('Data').AsDate:=

 DateTimePicker1.Date;

 try

 DM4.IBSP_Dob_Nakl_Z.Prepare;

 DM4.IBSP_Dob_Nakl_Z.ExecProc;

 Ok:=True;

 if(Ok) then

 begin

 for i:=1 to ValueListEditor1.RowCount-1 do

 begin

if(StringReplace(StringReplace(ValueListEditor1.Values[ValueListEditor1.Keys[i]],' ','',[rfReplaceAll]),'.',',',[rfReplaceAll])<>'')

 then

 begin

 DM4.IBSP_Dob_Str_Nakl_Z.ParamByName('NNakl_Zakaz').AsInteger:=

 StrToInt(StringReplace(MaskEdit1.EditText,' ','',[rfReplaceAll]));

 DM4.IBSP_Dob_Str_Nakl_Z.ParamByName('Naimen').AsString:=

 ValueListEditor1.Keys[i];

 DM4.IBSP_Dob_Str_Nakl_Z.ParamByName('Kolvo').AsFloat:=

StrToFloat(StringReplace(StringReplace(ValueListEditor1.Values[ValueListEditor1.Keys[i]],' ','',[rfReplaceAll]),'.',',',[rfReplaceAll]));

 DM4.IBSP_Dob_Str_Nakl_Z.ParamByName('Cena').AsFloat:=

 StrToFloat(ListBox1.Items[i-1]);

 DM4.IBSP_Dob_Str_Nakl_Z.Prepare;

 DM4.IBSP_Dob_Str_Nakl_Z.ExecProc;

 j:=j+1;

 end;

 end

 end;

 if((Ok) and (j<>0))

 then

 DM4.IBTrans_Write.Commit

 else ShowMessage('Ошибка добавления накладной !');

 except

 on E: Exception do

 begin

 if(Pos('Накладная с таким номером уже есть !!!',E.Message)<>0) then

 ShowMessage(' Накладная с таким номером уже есть !')

 else

 ShowMessage('Ошибка БД');

 DM4.IBTrans_Write.Rollback;

 end;

 end;

 end

 else ShowMessage('Введите номер накладной или срок выполнения !');

 end;



Листинг процедуры добавления лесобилета



procedure TDob_Lesobilet.Button1Click(Sender: TObject);

var i,j:Integer;

begin

 if(not DM1.IBTrans_Write.Active)

 then DM1.IBTrans_Write.StartTransaction;

 j:=0;

 try

 if(Kol_Del=0) then

 begin

 if(Trim(MaskEdit1.EditText)<>'') then

 begin

 DM1.IBSP_Dob_Lesobilet.ParamByName('Nomer').AsInteger:=

 StrToInt(Trim(MaskEdit1.EditText));

 DM1.IBSP_Dob_Lesobilet.ParamByName('Data').AsDate:=

 DateTimePicker1.Date;

 DM1.IBSP_Dob_Lesobilet.Prepare;

 DM1.IBSP_Dob_Lesobilet.ExecProc;

 Ok:=True;

 MaskEdit1.ReadOnly:=True;

 Kol_Del:=Kol_Del+1;

 end

 else

 begin

 ShowMessage('Введите номер лесобилета !');

 Ok:=False;

 end

 end;

 if((Ok) and (Trim(MaskEdit2.EditText)<>'') and

 (Trim(MaskEdit3.EditText)<>'*') and (Trim(MaskEdit4.EditText)<>','))

 then

 begin

 DM1.IBSP_Dob_Delanki.ParamByName('N_Delanka').AsInteger:=

 StrToInt(Trim(MaskEdit2.EditText));

 DM1.IBSP_Dob_Delanki.ParamByName('Kvadrat').AsString:=

 Trim(MaskEdit3.EditText);

 DM1.IBSP_Dob_Delanki.ParamByName('Plotschad').AsFloat:=

 StrToFloat(Trim(MaskEdit4.EditText));

 DM1.IBSP_Dob_Delanki.Prepare;

 DM1.IBSP_Dob_Delanki.ExecProc;

 DM1.IBSP_Dob_Str_Bilet.ParamByName('NLesobilet').AsInteger:=

 StrToInt(Trim(MaskEdit1.EditText));

 DM1.IBSP_Dob_Str_Bilet.ParamByName('NDelanka').AsInteger:=

 StrToInt(Trim(MaskEdit2.EditText));

 DM1.IBSP_Dob_Str_Bilet.Prepare;

 DM1.IBSP_Dob_Str_Bilet.ExecProc;

 for i:=1 to ValueListEditor1.RowCount-1 do

 begin

 if(ValueListEditor1.Values[ValueListEditor1.Keys[i]]<>'') then

 begin

 if(StrToFloat(ValueListEditor1.Values[ValueListEditor1.Keys[i]])>0)

 then

 begin

 DM1.IBSP_Dob_Nal_Drevesini.ParamByName('Kolvo').AsFloat:=

 StrToFloat(ValueListEditor1.Values[ValueListEditor1.Keys[i]]);

 DM1.IBSP_Dob_Nal_Drevesini.ParamByName('Poroda').AsString:=

 ValueListEditor1.Keys[i];

 DM1.IBSP_Dob_Nal_Drevesini.ParamByName('Nomer').AsInteger:=

 StrToInt(Trim(MaskEdit2.EditText));

 DM1.IBSP_Dob_Nal_Drevesini.Prepare;

 DM1.IBSP_Dob_Nal_Drevesini.ExecProc;

 end

 end

 else

 j:=j+1;

 end

 end;



 if((Ok) and (j<i)) then

 DM1.IBTrans_Write.Commit;

 except

 on E: Exception do

 begin

 if(Pos('Лесобилет с таким номером уже существует !!!',E.Message)<>0) then

 ShowMessage(' Лесобилет с таким номером уже существует !')

 else if(Pos(‘Делянка с таким номером уже существует !!!',E.Message)<>0) then

 ShowMessage(' Делянка с таким номером уже существует !')

 else

 ShowMessage('Ошибка БД !');

 DM1.IBTrans_Write.Rollback;

 end;

 end

end;









51