Методология проектирования баз данных
Расчётно-пояснительная записка к курсовой работе
По курсу «Проектирование алгоритмов и
Программного обеспечения»
Выполнил: студент группы САУ-81
Лебедев А.Л.
Руководитель: доцент, к. т. н.
Николаенко С. И.
Калуга
2005 г.
I . Проект базы данных для предприятия, занимающегося заготовкой древесины, её переработкой и сбытом готовой продукции
Деревообрабатывающее предприятие осуществляет заготовку, переработку и сбыт древесины. На предприятии осуществляется бригадный принцип организации труда. Бригада может иметь следующую специализацию: заготовительная, цеховая или погрузочная. Во главе бригад стоят бригадиры. Каждая бригада имеет свой табельный номер.
Заготовка древесины заключается в следующем. Лесничество выделяет предприятию лесобилеты, в которых указано, где находятся делянки и сколько леса может быть заготовлено на каждом участке. Также указывается порода древесины. На предприятии существует определённое лицо – заведующий делянками, - который выписывает у лесничества лесобилеты, выдаёт делянки бригадам, принимает делянки от бригад, сдаёт участки назад лесничеству. Назначенная на данную делянку бригада выпиливает лес и привозит его на базу предприятия.
Привезённый на базу лес сдаётся начальнику базы, который фиксирует кубатуру кругляка.
На территории предприятия находится несколько цехов по переработке древесины, за каждым цехом закреплена сушильная камера; также имеется склад готовой продукции. Цеха пронумерованы. В каждом цехе работает бригада, (в цехе их может быть несколько), которая осуществляет распиловку древесины и её сдачу на склад продукции. Бригадир получает лес от начальника базы. Приём готовой продукции ведёт кладовщик.
На предприятии определено также лицо, которое занимается продажей товара – начальник сбыта. Он договаривается с фирмами-клиентами об объёмах и датах поставок, видах продукции и, соответственно, определяет задание цеховым бригадам.
Работники и фирмы-клиенты могут иметь телефон. Их может быть несколько.
При работе с электронными документами должна быть доступна следующая информация:
1. штат сотрудников предприятия (таб. №, ФИО, дом. адрес, телефон, дата приёма на работу и назначения на должность, должность, номер бригады);
2. когда и сколько лесобилетов выписано лесничеством предприятию. В лесобилетах указывается расположение делянок, площадь, порода древесины;
3. какая бригада работает на делянке;
4. сколько леса бригада привезла на базу. Сколько всего леса и какого хранится на базе;
5. какую продукцию и по какой цене производит предприятие;
6. какой план, когда и на какой срок выдан начальником сбыта цеховым бригадам;
7. сколько леса выписал начальник бригады на базе и сдал продукции на склад. Сколько и какой продукции хранится на складе;
8. с какими фирмами-клиентами сотрудничает предприятие (название фирмы, адрес и телефон);
9. какой заказ и на какой срок сделан предприятию фирмой-клиентом (вид, количество продукции и по какой цене);
10. какой товар, сколько, по какой цене и когда отгружен фирме-клиенту.
Типовые операции (транзакции)
· приём на работу, приписывание к бригадам, назначение на должность, увольнение, снятие с должности работников, перевод в другую бригаду;
· создание новых и расформирование старых бригад;
· выписывание лесобилетов у лесничества;
· выдача делянок бригадам;
· приём делянок у бригад;
· возвращение делянок лесничеству;
· привоз леса бригадой на базу;
· выдача плана цеховым бригадам;
· получение леса бригадирами на базе;
· сдача продукции на склад;
· добавление и удаление фирм-клиентов;
· получение заказа от фирмы-клиента;
· продажа продукции.
II Концептуальное проектирование
Типы сущности
Выделим следующие типы сущностей:
1. древесина;
2. лесобилет;
3. делянка;
4. работник;
5. бригада;
6. бригадир;
7. зав. делянками;
8. нач. базы;
9. продукция (товар);
10. зав. складом
11. нач. сбыта;
12. фирма-клиент;
13. телефон;
14. накладная на возврат делянки лесничеству;
15. накладная на заказ товара;
16. накладная на продажу товара;
17. план работы цеховой бригады;
Типы сущностей
Наименование | Краткое описание | Синонимы | Особенности | ||
древесина | сырьё для продукции | лес, сырьё |
| ||
лесобилет | документ, который выдаётся лесничеством | нумерация лесобилетов ведётся в рамках текущего года | |||
делянка | место в лесополосе, где предприятию разрешено выпиливание леса | участок | делянки могут возвращаться лесничеству по одной по мере выпиливания в них леса | ||
работник | общее наименование для всех работающих на предприятии | каждый работник входит в состав какой-либо бригады, кроме нач. базы, зав. складом, зав. делянками и нач. сбыта | |||
бригада | основное рабочее звено предприятия | каждая бригада выполняет только определённые виды работ | |||
бригадир | работник, возглавляющий бригаду | начальник | в каждой бригаде обязательно есть бригадир | ||
зав. делянками | работник, занимающийся выпиской лесобилетов у лесничества и возвратом участков, а также следящий за использованием делянок бригадами | эту должность занимает только один работник | |||
нач. базы | работник, который принимает лес и выдаёт лес цеховым бригадам | --//-- | |||
зав. складом | работник, который принимает готовую продукцию у цеховых бригад и выдаёт её фирмам- клиентам | кладовщик | --//-- | ||
нач. сбыта | работник, который непосредственно сотрудничает с фирмами-клиентами и определяет план работы цеховым бригадам | --//-- | |||
продукция | совокупность изделий, которые выпускает предприятие | товар | вся продукция хранится на одном складе, может иметь одинаковое наименование, но разную цену | ||
фирма-клиент | фирмы, которые осуществляют заказ и покупку продукции | фирма-покупатель, фирма-заказчик | делает заказ на продукцию, однако если таковая имеется на складе, может приобрести её сразу | ||
телефон | средство сообщения между лесничеством, фирмами-клиентами и руководящими работниками, а также работников между собой | фирмы-клиенты и работники могут иметь несколько номеров телефонов | |||
накладная на возврат делянки лесничеству | документ, который свидетельствует, что лесничество приняло делянку у предприятия (зав. делянками) | нумерация накладных ведётся в рамках года | |||
накладная на заказ товара | документ, в котором фирма-клиент указывает какую продукцию она хочет приобрести и в какой срок | бланк заказа | --//-- | ||
накладная на продажу товара | документ, который выписывает у зав. складом фирма-клиент, где указывается, какую продукцию она хочет приобретает и когда срок |
| нумерация накладных ведётся в рамках года | ||
план работы цеховой бригады | график работы бригады | график работы | выдаётся цеховым бригадам | ||
Типы связей
Определим типы связей:
1. работник приписан к бригаде;
2. бригаду возглавляет бригадир;
3. зав. делянками выписывает лесобилет;
4. лесобилет содержит делянку;
5. древесина указана для делянки;
6. зав. делянки оформляет накладную на возврат делянки лесничеству;
7. накладная на возврат делянки лесничеству содержит делянку;
8. делянка закреплена за бригадиром;
9. древесина имеется у бригадира;
10. лес хранится у начальника базы;
11. начальник сбыта оформляет накладную на заказ;
12. фирма-клиент выписывает накладную на заказ;
13. продукция входит в накладную на заказ;
14. начальник сбыта выдаёт план работы;
15. бригадир получает план работы;
16. продукция входит в план работы;
17. бригадир сдаёт продукцию;
18. продукция хранится у зав. складом;
19. зав. складом оформляет накладную на продажу;
20. фирма-клиент выписывает накладную на продажу;
21. продукция входит в накладную на продажу;
22. фирма-клиент имеет телефон;
23. работник имеет телефон.
Типы связей
Тип сущности | Тип связи | Тип сущности | Кардинальность | Степень участия |
древесина | указана для | делянка | 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:Т |
Атрибуты
Тип сущности/ связи | Атрибут | Описание | Тип данных | Значение по умолчанию | Допустимость Null | Производный, множестве-нный |
древесина | порода | порода деревьев | символьный | - | нет | множ |
Лесо-билет | номер | целый | - | нет | - | |
дата | дата выписки | дата | - | нет | - | |
делянка | номер | целый | - | нет | - | |
| квадрат | Местопол-ожение | символьный | - | нет | - |
площадь | плав-щий | - | нет | - | ||
работник | таб. номер | целый | - | нет | - | |
ФИО | фамилия, имя, отчество | символьный | - | нет | - | |
адрес | адрес места жительства | символьный | - | нет | - | |
телефон | символьный | - | да | множ | ||
дата поступления | дата приёма на работу | дата | - | нет | - | |
зав. делянками | те же, что у работника + | |||||
дата назначения | дата назначения на должность | дата | - | нет | - | |
нач. базы | те же, что у зав. делянками | |||||
зав. складом | те же, что у зав. делянками | |||||
нач. сбыта | те же, что у зав. делянками | |||||
бригада | таб. номер | целый | - | нет | - | |
специализация | место работы бригады | символьный | - | нет | - | |
номер цеха | цех, в котором работает бригада | целый | да | - | ||
бригадир | те же, что у работника + | |||||
дата назначения | дата назначения на должность | дата | - | нет | - | |
продукция | наименование | символьный | - | нет | - | |
цена | плав-щий | - | нет | - | ||
ед. измер-я | символьный | - | нет | - | ||
фирма-клиент | наименование | символьный | - | нет | - | |
адрес | юридический адрес фирмы | символьный | - | нет | ||
телефон | символьный | - | да | множ | ||
накладная на возврат делянки лесниче-ству | номер | целый | - | нет | - | |
дата | дата выписки | дата | - | нет | - | |
накладная на заказ товара | номер | целый | - | нет | - | |
дата | даты выписки | дата | - | нет | - | |
срок | срок выполнения заказа | целый | - | нет | - | |
Накладная на продажу | номер | целый | - | нет | - | |
дата | дата выписки | дата | - | нет | - | |
план работы цеховой бригады | те же, что у накладной на заказ+ | |||||
объём | общий объём древесины, необходимый для выполнения плана | плав-щий | - | нет | - | |
хранится у | кол-во | кол-во древесины у нач. базы, у зав. складом | плав-щий | - | нет | - |
сдаёт | кол-во | кол-во продукции, которую сдаёт бригадир зав. складом | плав-щий | - | нет | - |
имеется у | кол-во | кол-во древесины, которое имеется у бригадира | плав-щий | - | нет | - |
указана для | кол-во | кол-во древесины на делянке | плав-щий | - | нет | - |
Домены атрибутов
Домен | Атрибуты | Тип данных | Ограничения | Примеры значений |
порода | порода | символьный(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-модели
Ключи
Тип сущности | Первичный ключ | Альтернативные ключи |
древесина | порода | |
лесобилет | номер | |
делянка | номер | квадрат, площадь |
работник бригадир зав. делянками нач. базы зав. складом нач. сбыта | таб. номер | ФИО, адрес |
бригада | таб. номер | |
продукция | наименование, цена | |
фирма-клиент | название, адрес | |
накладная на возврат делянки лесничеству, накладная на заказ и на продажу, план работы | номер | |
телефон | номер | |
наличие | слабая сущность | |
хранение | слабая сущность | |
строка лесобилета | слабая сущность | |
строка накладной на возврат делянки лесничеству | слабая сущность | |
объём товара | слабая сущность | |
строка накладной на заказ | слабая сущность | |
строка накладной на продажу | слабая сущность | |
строка плана работы | слабая сущность | |
наличие древесины | слабая сущность |
Бизнес правила
Недопустимо, чтобы работники одновременно были приписаны к нескольким бригадам или один работник занимал несколько должностей, было несколько зав. складом, зав. делянками, нач. базы и нач. сбыта, бригады получали делянки, которые уже выпилены, чтобы количество древесины и продукции передавалось больше, чем есть в наличии и т.д.
Скрипты создания таблиц
Замечание: различного рода ограничения реализуются с помощью доменов, триггеров и хранимых процедур.
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;
Создание вторичных индексов
Для повышения производительности в таблицах «Работник», «Продукция», «Клиент» были созданы вторичные индексы.
Скрипты создания вторичных индексов
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");
Права доступа
Транзакции 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;
Методология проектирования баз данных
Дата: 2019-07-30, просмотров: 203.