= Функционални зависности = Дадена е релационата шема за базата на податоци која ја креиравме, која може да се претстави во една релација со сите атрибути од сите релации споени заедно. Секако, дупликатите ќе бидат отстранети при тоа што ова не претставува проблем. Нека {{{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 ) }}} == Иницијални функционални зависности 1. {{{id → name, email, password, is_admin}}} 2. {{{producer_id → address, country, phone_number, email}}} 3. {{{product_id → name, description, hs_code, price, unit_of_measure}}} 4. {{{batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch}}} 5. {{{transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions}}} 6. {{{order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id}}} 7. {{{payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id}}} 8. {{{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)}}} Изведено: 9. {{{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 Транзитивен closure Нека {{{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}}} групирајќи ги детерминантите на ЛС со ДС, за да добиеме следниве релации: === {{{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}}}.