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, отношению PostavschikiCodePost à 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 ;^