Version 13 (modified by 2 weeks ago) ( diff ) | ,
---|
Функционални релации
Дадена е релационата шема за базата на податоци која ја креиравме, која може да
се претстави во една релација со сите атрибути од сите релации споени заедно.
Секако, дупликатите ќе бидат отстранети при тоа што ова не претставува проблем.
Нека R
биде релацијата опишана како што следи:
R( id, name, email, password, is_admin, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address, address, producer_id, description, hs_code, price, unit_of_measure, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch, transport_id, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions, status, estimated_delivery_date, buyer_id, receiver_id, amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, quantity, price_per_unit, total_price, created_at, updated_at )
Иницијални функционални релации
id → name, email, password, is_admin
producer_id → address, country, phone_number, email
product_id → name, description, hs_code, price, unit_of_measure
batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch
transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions
order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id
payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id
order_batch_id → quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id
Изведени функционални релации кои не се присутни во иницијалниот список
Транзитивни
order_id → buyer_id, receiver_id, transport_id (од FD 6)
Изведено
order_id → status, estimated_delivery_date
Анализа на функционални релации користејќи LHS/RHS класификација
Ова е методот за анализа на функционалните релации преку групирање на атрибутите во три категории
LHS
— атрибути кои се појавуваат само на левата страна (како детерминанти)
RHS
— атрибути кои се појавуваат само на десната страна (како релација)
LHS + RHS
— атрибути кои се појавуваат и на двете страни на релациите
Оваа техника помага при разбирање на улогата на атрибутите во одредувањето на другите, и е корисна за нормализација и откривање на кандидатните клучеви.
Класификација на атрибути
Само LHS
Атрибути кои се појавуваат само како детерминанти:
id, producer_id, product_id, batch_id, transport_id, order_id, payment_id, order_batch_id
Овие атрибути се потенцијални кандидатни клучеви, бидејќи тие го одредуваат другите атрибути и самите не се одредени од ништо друго.
Само RHS
Атрибути кои се појавуваат само како релација:
name, email, password, is_admin, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address, description, hs_code, price, unit_of_measure, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions, status, estimated_delivery_date, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, quantity, price_per_unit, total_price, created_at, updated_at
Овие се неклучни атрибути, кои мора да бидат целосно и неконфузно зависни од кандидатните клучеви во повисоки нормални форми (2NF, 3NF).
LHS + RHS
Атрибути кои се појавуваат и на левата и на десната страна на функционалните релации:
product_id, batch_id, transport_id, order_id
Овие атрибути можат да воведат некои транзитивни релации и проблеми.
LHS Транзитивен затворач
Нека X+ = {order_id, transport_id, payment_id
}
Пресметување на атрибутната затвореност за сетот X
ќе даде:
X+ = { order_id, transport_id, payment_id, name, email, password, is_admin, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address, description, hs_code, price, unit_of_measure, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions, status, estimated_delivery_date, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, quantity, price_per_unit, total_price, created_at, updated_at }
Оваа релација не го прикажува сетот на атрибути X
како кандидатен клуч, но
ако додадеме product_id и batch_id за да формираме сет {{{Y = {order_id,
transport_id, payment_id, product_id, batch_id}}}}, ќе добиеме следната
атрибутна затвореност:
Y+ = { order_id, transport_id, payment_id, product_id, batch_id, name, email, password, is_admin, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address, description, hs_code, price, unit_of_measure, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions, status, estimated_delivery_date, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, quantity, price_per_unit, total_price, created_at, updated_at }
Додавањето само на product_id
или batch_id
нема да даде кандидатен
клуч, бидејќи ќе недостигаат информации за производот или серијата. Сето ова ги
дава сите атрибути. Затоа, сетот на атрибути Y
може да се третира како
кандидатен клуч и се прогласува како примарен клуч овде.
Нормализирање
Тековна нормална форма
Релацијата R
веќе е во 1NF
согласно со дефиницијата, бидејќи нема
мултивредносни атрибути.
Базата на податоци е имплементирана со SQL DDL, што значи дека релационата шема
е внатрешно во 1NF
Заклучуваме дека R
ја задоволува 1NF
. Но според дефиницијата на
2NF
, релација е во 2NF
ако:
- Таа веќе е во прва нормална форма
1NF
- Нема парцијални релации на никакви определени атрибути од стриктно
подмножество на било кој кандидатен клуч
Но релацијата не е во 2NF
поради тоа што имаме јасни парцијални
релации. Контрапример е batch_id → batch_code, production_date
- но има
и повеќе.
Декомпозиција на R
во нови релации за да се постигне BCNF
Започнуваме со раздвојување на R
групирајќи ги детерминантите на LHS со RHS,
за да добиеме следниве релации:
USER
id → name, email, password, is_admin
R1(id, name, email, password, is_admin)
CLIENT
id → name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address
R2(id, name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address)
PRODUCER
producer_id → address, country, phone_number, email
R3(producer_id, address, country, phone_number, email)
PRODUCT
product_id → name, description, hs_code, price, unit_of_measure
R4(product_id, name, description, hs_code, price, unit_of_measure)
BATCH
batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch
R5(batch_id, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch)
TRANSPORT
transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions
R6(transport_id, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions)
ORDER
order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id
R7(order_id, date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id)
PAYMENT
payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id
R8(payment_id, amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id)
ORDER_BATCHES
order_batch_id → quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id
R9(order_batch_id, quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id)
Проверка на нормалната форма после првата декомпозиција
USER
Атрибути
id, name, email, password, is_admin
Функционални релации
id → name, email, password, is_admin
Кандидатен клуч: id
Оваа релација е во 2NF
бидејќи не постојат парцијални релација.
За постигнување 3NF
, не се јавуваат транзитивни релации, така да оваа
релација е во 3NF
.
Исто така, бидејќи id е кандидатен клуч, релацијата е и во BCNF
.
CLIENT
Атрибути
id, name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address
Функционални релации
id → name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address
Кандидатен клуч id
Оваа релација е во 2NF
и не се појавуваат транзитивни релации, така да е во 3NF
и во BCNF
.
PRODUCER
Атрибути
producer_id, address, country, phone_number, email
Функционални релации
producer_id → address, country, phone_number, email
Кандидатен клуч producer_id
И оваа релација е во 2NF
, 3NF
и BCNF
.
PRODUCT
Атрибути
product_id, name, description, hs_code, price, unit_of_measure
Функционални релации
product_id → name, description, hs_code, price, unit_of_measure
Кандидатен клуч product_id
Оваа релација е во 2NF
, 3NF
и BCNF
.
BATCH
Атрибути
batch_id, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch
Функционални релации
batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch
Кандидатен клуч batch_id
Релацијата е во 2NF
, 3NF
и BCNF
.
TRANSPORT
Атрибути
transport_id, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions
Функционални релации
transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions
Кандидатен клуч transport_id
Оваа релација е во 2NF
, 3NF
и BCNF
.
ORDER
Атрибути
order_id, date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id
Функционални релации
order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id
Кандидатен клуч order_id
Релацијата е во 2NF
, 3NF
и BCNF
.
PAYMENT
Атрибути
payment_id, amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id
Функционални релации
payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id
Кандидатен клуч payment_id
Релацијата е во 2NF
, 3NF
и BCNF
.
ORDER_BATCHES
Атрибути
order_batch_id, quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id
Функционални релации
order_batch_id → quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id
Кандидатен клуч order_batch_id
Релацијата е во 2NF
, 3NF
и BCNF
.