Zakazy (NomZk, Kol-vo, Customer, CodeTov), Tovar(CodeTov, Naim, Price, CodePost), Postavschiki(CodePost, Name. Address).
Определим ФЗ, которые соответствуют отношениям. Отношению Zakazyсоответствует полная ФЗ NomZk à Kol-vo, Customer,CodeTov,отношению Tovar —полная ФЗ CodeTov à Naim, Price, CodePost, отношению Postavschiki— CodePost à Name, Address.
Как видно из диаграммы каждое из полученных отношений содержит только одну полную ФЗ, следовательно отношения нормализованы, то есть приведены к третьей нормальной форме.
Сущность | Атрибут | Столбец | Мотивация | Тип данных | Примечание |
Zakazy | NomZk | NomZk | Номер заказа | Integer | Primary Key |
Zakazy | Kol-vo | Kol-vo | Количество товара | Integer | |
Zakazy | Customer | Customer | Имя покупателя | Char(20) | |
Zakazy | CodeTov | CodeTov | Код товара | Integer | Foreign Key |
Postavschiki | CodePost | CodePost | Код Поставщика | Integer | Primary Key |
Postavschiki | Name | Name | Название организации поставщика | Char(20) | |
Postavschiki | Address | Address | Адрес поставщика | Char(20) | |
Tovar | CodeTov | CodeTov | Код товара | Integer | Primary Key |
Tovar | Naim | Naim | Наименование товара | Char(20) | |
Tovar | Price | Price | Цена товара | Integer | |
Tovar | CodePost | Price | Код поставщика | Integer | Foreign Key |
Сущности Zakazy и Tovar связаны при помощи неидентифицирующей связи «один-ко-многим», причем она «Optional-Mandatory», то есть каждый заказ должен содержать один или несколько товаров, но каждый товар может содержаться в 0 или несколько заказов.
Сущности Tovar и Postavschiki связаны при помощи неидентифицирующей связи «один-ко многим», причем она «Mandatory-Mandatory», то есть у каждого товара должен быть свой поставщик и каждый поставщик должен поставлять 1 или несколько товаров.
SQL-код
/*
Created 19.09.2007
Modified 01.01.2000
Project
Model
Company
Author
Version
Database Firebird
*/
Create Table "Tovar" (
"CodeTov" Integer NOT NULL,
"Name" Char(20) NOT NULL UNIQUE,
"Price" Integer NOT NULL,
"CodePost" Integer NOT NULL,
Constraint "pk_Tovar" Primary Key ("CodeTov")
);
Create Table "Postavschiki" (
"CodePost" Integer NOT NULL,
"Name" Char(20) UNIQUE,
"Address" Char(20) NOT NULL UNIQUE,
Constraint "pk_Postavschiki" Primary Key ("CodePost")
);
Create Table "Zakazy" (
"NomZk" Char(20) NOT NULL,
"Kol_vo" Integer NOT NULL,
"Customer" Char(20) NOT NULL,
"CodeTov" Integer NOT NULL,
Constraint "pk_Zakazy" Primary Key ("NomZk")
);
Alter Table "Zakazy" add Constraint "Zapros1" Foreign Key ("CodeTov") references "Tovar" ("CodeTov") on delete no action ;
Alter Table "Tovar" add Constraint "Zapros2" Foreign Key ("CodePost") references "Postavschiki" ("CodePost") on delete no action ;
Create Exception "except_del_p" 'Children still exist in child table. Cannot delete parent.';
Create Exception "except_ins_ch" 'Parent does not exist. Cannot create child.';
Create Exception "except_upd_ch" 'Parent does not exist. Cannot update child.';
Create Exception "except_upd_p" 'Children still exist in child table. Cannot update parent.';
Create Exception "except_ins_ch_card" 'Maximum cardinality exceeded. Cannot insert into child.';
Create Exception "except_upd_ch_card" 'Maximum cardinality exceeded. Cannot update child.';
set term ^;
/* Update trigger for Tovar */
Create Trigger "tu_Tovar"
for "Tovar" before update as
declare variable numrows integer;
begin
/* Restrict child Zakazy, when parent Tovar changed */
if (old."CodeTov" != new."CodeTov") then
begin
select count(*)
from "Zakazy"
where "Zakazy"."CodeTov" = old."CodeTov"
into :numrows;
if (numrows > 0) then
exception "except_upd_p";
end
end
^
/* Update trigger for Postavschiki */
Create Trigger "tu_Postavschiki"
for "Postavschiki" before update as
declare variable numrows integer;
begin
/* Restrict child Tovar, when parent Postavschiki changed */
if (old."CodePost" != new."CodePost") then
begin
select count(*)
from "Tovar"
where "Tovar"."CodePost" = old."CodePost"
into :numrows;
if (numrows > 0) then
exception "except_upd_p";
end
end
^
set term ;^