| 1 | | = Users |
| 2 | | |
| 3 | | {{{USERS(id, name, email, password, is_admin)}}} |
| | 1 | = Функционални зависности = |
| | 2 | |
| | 3 | Дадена е релационата шема за базата на податоци која ја креиравме, која може да |
| | 4 | се претстави во една релација со сите атрибути од сите релации споени заедно. |
| | 5 | Секако, дупликатите ќе бидат отстранети при тоа што ова не претставува проблем. |
| | 6 | Нека {{{R}}} биде релацијата опишана како што следи: |
| | 7 | |
| | 8 | {{{ |
| | 9 | R( |
| | 10 | id, name, email, password, is_admin, |
| | 11 | country, registration_number, tax_code, contact_person, phone_number, |
| | 12 | billing_address, shipping_address, address, producer_id, description, |
| | 13 | hs_code, price, unit_of_measure, batch_code, production_date, expiration_date, |
| | 14 | net_weight, gross_weight, units_per_batch, transport_id, departure_point, |
| | 15 | arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, |
| | 16 | insurance_conditions, status, estimated_delivery_date, buyer_id, receiver_id, |
| | 17 | amount, currency, due_date, exchange_rate, payment_date, payment_method, |
| | 18 | payment_status, quantity, price_per_unit, total_price, created_at, updated_at |
| | 19 | ) |
| | 20 | }}} |
| | 21 | |
| | 22 | == Иницијални функционални зависности |
| | 23 | |
| | 24 | 1. {{{id → name, email, password, is_admin}}} |
| | 25 | |
| | 26 | 2. {{{producer_id → address, country, phone_number, email}}} |
| | 27 | |
| | 28 | 3. {{{product_id → name, description, hs_code, price, unit_of_measure}}} |
| | 29 | |
| | 30 | 4. {{{batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch}}} |
| | 31 | |
| | 32 | 5. {{{transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions}}} |
| | 33 | |
| | 34 | 6. {{{order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id}}} |
| | 35 | |
| | 36 | 7. {{{payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id}}} |
| | 37 | |
| | 38 | 8. {{{order_batch_id → quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id}}} |
| | 39 | |
| | 40 | == Изведени функционални зависности кои не се присутни во иницијалниот список |
| | 41 | |
| | 42 | === Транзитивни |
| | 43 | |
| | 44 | {{{order_id → buyer_id, receiver_id, transport_id (од FD 6)}}} |
| | 45 | |
| | 46 | Изведено: |
| | 47 | |
| | 48 | 9. {{{order_id → status, estimated_delivery_date}}} |
| | 49 | |
| | 50 | == Анализа на функционални зависности користејќи LHS/RHS класификација |
| | 51 | |
| | 52 | Ова е методот за анализа на функционалните зависности преку групирање на атрибутите во три категории |
| | 53 | |
| | 54 | {{{LHS}}} — атрибути кои се појавуваат само на левата страна (како детерминанти) |
| | 55 | {{{RHS}}} — атрибути кои се појавуваат само на десната страна (како зависности) |
| | 56 | {{{LHS + RHS}}} — атрибути кои се појавуваат и на двете страни на зависностите |
| | 57 | |
| | 58 | Оваа техника помага при разбирање на улогата на атрибутите во одредувањето на другите, и е корисна за нормализација и откривање на кандидатни клучеви. |
| | 59 | |
| | 60 | === Класификација на атрибути |
| | 61 | |
| | 62 | ==== Само LHS |
| | 63 | |
| | 64 | Атрибути кои се појавуваат само како детерминанти: |
| | 65 | |
| | 66 | {{{id, producer_id, product_id, batch_id, transport_id, order_id, payment_id, order_batch_id}}} |
| | 67 | |
| | 68 | Овие атрибути се потенцијални {{{кандидатни клучеви}}}, бидејќи тие го одредуваат другите атрибути и самите не се одредени од ништо друго. |
| | 69 | |
| | 70 | ==== Само RHS |
| | 71 | |
| | 72 | Атрибути кои се појавуваат само како зависности: |
| | 73 | |
| | 74 | {{{ |
| | 75 | name, email, password, is_admin, country, registration_number, tax_code, |
| | 76 | contact_person, phone_number, billing_address, shipping_address, description, |
| | 77 | hs_code, price, unit_of_measure, batch_code, production_date, expiration_date, |
| | 78 | net_weight, gross_weight, units_per_batch, departure_point, arrival_point, |
| | 79 | estimated_departure_date, estimated_arrival_date, incoterm, |
| | 80 | insurance_conditions, status, estimated_delivery_date, currency, due_date, |
| | 81 | exchange_rate, payment_date, payment_method, payment_status, quantity, |
| | 82 | price_per_unit, total_price, created_at, updated_at |
| | 83 | }}} |
| | 84 | |
| | 85 | Овие се неклучни атрибути, кои мора да бидат целосно и неконфузно зависни од кандидатните клучеви во повисоки нормални форми (2NF, 3NF). |
| | 86 | |
| | 87 | ==== LHS + RHS |
| | 88 | |
| | 89 | Атрибути кои се појавуваат и на левата и на десната страна на функционалните зависности: |
| | 90 | |
| | 91 | {{{product_id, batch_id, transport_id, order_id}}} |
| | 92 | |
| | 93 | Овие атрибути можат да воведат некои транзитивни зависности и проблеми. |
| | 94 | |
| | 95 | == LHS Транзитивен closure |
| | 96 | |
| | 97 | Нека {{{X+ = {order_id, transport_id, payment_id}}}} |
| | 98 | |
| | 99 | Пресметување на атрибутната затвореност за сетот {{{X}}} ќе даде: |
| | 100 | |
| | 101 | {{{ |
| | 102 | X+ = { |
| | 103 | order_id, transport_id, payment_id, |
| | 104 | name, email, password, is_admin, country, registration_number, |
| | 105 | tax_code, contact_person, phone_number, billing_address, shipping_address, |
| | 106 | description, hs_code, price, unit_of_measure, batch_code, production_date, |
| | 107 | expiration_date, net_weight, gross_weight, units_per_batch, |
| | 108 | departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, |
| | 109 | incoterm, insurance_conditions, status, estimated_delivery_date, currency, |
| | 110 | due_date, exchange_rate, payment_date, payment_method, payment_status, |
| | 111 | quantity, price_per_unit, total_price, created_at, updated_at |
| | 112 | } |
| | 113 | }}} |
| | 114 | |
| | 115 | Оваа релација не го прикажува сетот на атрибути {{{X}}} како кандидатен клуч, но |
| | 116 | ако додадеме product_id и batch_id за да формираме сет {{{Y = {order_id, |
| | 117 | transport_id, payment_id, product_id, batch_id}}}}, ќе добиеме следната |
| | 118 | атрибутна затвореност: |
| | 119 | |
| | 120 | {{{ |
| | 121 | Y+ = { |
| | 122 | order_id, transport_id, payment_id, product_id, batch_id, |
| | 123 | name, email, password, is_admin, country, registration_number, |
| | 124 | tax_code, contact_person, phone_number, billing_address, shipping_address, |
| | 125 | description, hs_code, price, unit_of_measure, batch_code, production_date, |
| | 126 | expiration_date, net_weight, gross_weight, units_per_batch, |
| | 127 | departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, |
| | 128 | incoterm, insurance_conditions, status, estimated_delivery_date, currency, |
| | 129 | due_date, exchange_rate, payment_date, payment_method, payment_status, |
| | 130 | quantity, price_per_unit, total_price, created_at, updated_at |
| | 131 | } |
| | 132 | }}} |
| | 133 | |
| | 134 | Додавањето само на {{{product_id}}} или {{{batch_id}}} нема да даде кандидатен |
| | 135 | клуч, бидејќи ќе недостигаат информации за производот или партијата. Сето ова |
| | 136 | дава сите атрибути. Затоа, сетот на атрибути Y може да се третира како |
| | 137 | кандидатен клуч и се прогласува како примарен клуч овде. |
| | 138 | |
| | 139 | = Нормализирање |
| | 140 | |
| | 141 | == Тековна нормална форма |
| | 142 | |
| | 143 | Дадени функционални зависности, релацијата {{{R}}} веќе е во {{{1NF}}} согласно |
| | 144 | со дефиницијата, бидејќи нема мултивредносни атрибути. |
| | 145 | |
| | 146 | Базата на податоци е имплементирана со SQL DDL, што значи дека релационата шема |
| | 147 | е внатрешно во {{{1NF}}} |
| | 148 | |
| | 149 | Заклучуваме дека {{{R}}} ја задоволува {{{1NF}}}. Но според дефиницијата на |
| | 150 | {{{2NF}}}, релација е во {{{2NF}}} ако: |
| | 151 | |
| | 152 | - Таа веќе е во прва нормална форма {{{1NF}}} |
| | 153 | - Нема парцијални зависности на никакви непријатни атрибути (определени |
| | 154 | атрибути) од стриктен подсет на било кој кандидатен клуч |
| | 155 | |
| | 156 | Но релацијата не е во {{{2NF}}} поради тоа што имаме јасни парцијални |
| | 157 | зависности. Контрапример е {{{batch_id → batch_code, production_date}}} - но има |
| | 158 | и повеќе. |
| | 159 | |
| | 160 | == Декомпозиција на {{{R}}} во нови релации за да се постигне {{{BCNF}}} |
| | 161 | |
| | 162 | Започнуваме со раздвојување на {{{R}}} групирајќи ги детерминантите на ЛС со ДС, |
| | 163 | за да добиеме следниве релации: |
| | 164 | |
| | 165 | === {{{USER}}} |
| 17 | | - **1NF**: Табелата {{{CLIENTS}}} е во **1NF** затоа што сите атрибути содржат атомски вредности и нема дупликат вредности. Адресата за наплата и испорака, и сите други атрибути се одвоени и не се повторуваат. |
| 18 | | - **2NF**: Табелата е во **2NF** затоа што сите атрибути зависат целосно од примарниот клуч {{{id}}}. Не постојат делумни релации, бидејќи сите атрибути се однесуваат на целиот ентитет (клиент). |
| 19 | | - **BCNF**: Табелата е во **BCNF** затоа што секоја релација е целосно зависна од примарниот клуч и нема транзитивни релации. Нема не-клучни атрибути кои зависат од друг не-клучен атрибут. |
| 20 | | |
| 21 | | Во новата база на податоци, табелата {{{CLIENTS}}} ги заменува старите табели {{{BUYER}}} и {{{RECEIVER}}}. Оваа промена беше направена за да се поедностави структурата на базата и да се избегне двојна евиденција за истите ентитети. Наместо две посебни табели (една за купувачи и друга за примачи), сега и купувачите и примачите се чуваат во една табела, што е поефикасно и попрактично за управување со податоците. |
| 22 | | |
| 23 | | {{{BUYER}}} и {{{RECEIVER}}} беа две различни табели, со различни атрибути за секој ентитет. Секој купувач имаше своја табела за информации поврзани со купувањето, а секој примач имаше посебна табела за податоците за испорака. |
| 24 | | |
| 25 | | {{{CLIENTS}}} сега ја обединува оваа функционалност, бидејќи и купувачот и примачот може да бидат идентификувани како клиенти. Табелата {{{CLIENTS}}} вклучува целокупната информација за компаниите кои учествуваат во процесот на продажба и испорака, вклучувајќи и {{{billing_address}}} и {{{shipping_address}}}, кои се претходно разликувани помеѓу купувачот и примачот. |
| 26 | | |
| 27 | | = Transports |
| 28 | | |
| 29 | | {{{TRANSPORTS(id, name, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions)}}} |
| 30 | | |
| 31 | | {{{id → name, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions}}} |
| 32 | | |
| 33 | | - **1NF**: Табелата е во **1NF** бидејќи секое поле содржи атомски вредности и нема дупликат вредности. |
| 34 | | - **2NF**: Табелата е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч. Нема делумни релации. |
| 35 | | - **BCNF**: Табелата е во **BCNF** бидејќи секоја релација е целосно зависна од примарниот клуч и нема транзитивни релации. |
| 36 | | |
| 37 | | = Producers |
| 38 | | |
| 39 | | {{{PRODUCERS(id, name, address, country, phone_number, email)}}} |
| 40 | | |
| 41 | | {{{id → name, address, country, phone_number, email}}} |
| 42 | | |
| 43 | | - **1NF**: Табелата е во **1NF** бидејќи секое поле содржи атомски вредности и нема дупликат вредности. |
| 44 | | - **2NF**: Табелата е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч. Нема делумни релации. |
| 45 | | - **BCNF**: Табелата е во **BCNF** бидејќи нема транзитивни релации и сите атрибути зависат целосно од примарниот клуч. |
| 46 | | |
| 47 | | = Products |
| 48 | | |
| 49 | | {{{PRODUCTS(id, name, description, hs_code, price, producer_id* (PRODUCERS), unit_of_measure)}}} |
| 50 | | |
| 51 | | {{{id → name, description, hs_code, price, producer_id, unit_of_measure}}} |
| 52 | | |
| 53 | | - **1NF**: Табелата е во **1NF** бидејќи секое поле содржи атомски вредности и нема дупликат вредности. |
| 54 | | - **2NF**: Табелата е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч. Надворешниот клуч {{{producer_id}}} не создава делумни релации. |
| 55 | | - **BCNF**: Табелата е во **BCNF** бидејќи сите атрибути зависат целосно од примарниот клуч и нема транзитивни релации. |
| 56 | | |
| 57 | | = Batches |
| 58 | | |
| 59 | | {{{BATCHES(id, product_id* (PRODUCTS), batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch)}}} |
| 60 | | |
| 61 | | {{{id → product_id, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch}}} |
| 62 | | |
| 63 | | - **1NF**: Табелата {{{BATCHES}}} е во **1NF** бидејќи секое поле содржи атомски вредности. Нема дупликат вредности или структурни комплификации. Секој ред претставува една серија и не постојат атрибути кои содржат повеќе од една вредност. |
| 64 | | - **2NF**: Табелата {{{BATCHES}}} е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч {{{id}}}. Надворешниот клуч {{{product_id}}} не создава делумни релации. Секој атрибут во табелата е директно поврзан со целокупниот идентитет на серијата, кој е идентификуван преку примарниот клуч. |
| 65 | | - **BCNF**: Табелата {{{BATCHES}}} е во **BCNF** затоа што нема транзитивни релации. Сите атрибути зависат целосно од примарниот клуч {{{id}}} и нема релации каде не-клучни атрибути зависат од други не-клучни атрибути. |
| 66 | | |
| 67 | | Во новата база на податоци, табелата {{{BATCHES}}} е додадена како нова структура која ги претставува сериите. Оваа табела е важна за управување со производите во контекст на сериите, нивните рокови на траење и друга релевантна продукциска информација. |
| 68 | | |
| 69 | | = Orders |
| 70 | | |
| 71 | | {{{ORDERS(id, date, status, estimated_delivery_date, buyer_id* (CLIENTS), receiver_id* (CLIENTS), transport_id* (TRANSPORTS), payment_id* (PAYMENTS))}}} |
| 72 | | |
| 73 | | {{{id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id, payment_id}}} |
| 74 | | |
| 75 | | - **1NF**: Табелата е во **1NF** бидејќи сите атрибути содржат атомски вредности и нема дупликат вредности. |
| 76 | | - **2NF**: Табелата е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч. Foreign keys ({{{buyer_id}}}, {{{receiver_id}}}, {{{transport_id}}}, {{{payment_id}}}) не создаваат делумни релации. |
| 77 | | - **BCNF**: Табелата е во **BCNF** бидејќи секоја релација е целосно зависна од примарниот клуч и нема транзитивни релации. |
| 78 | | |
| 79 | | = Order Batches |
| 80 | | |
| 81 | | {{{ORDER_BATCHES(id, order_id* (ORDERS), batch_id* (BATCHES), quantity, price_per_unit, total_price, created_at, updated_at)}}} |
| 82 | | |
| 83 | | {{{id → order_id, batch_id, quantity, price_per_unit, total_price, created_at, updated_at}}} |
| 84 | | |
| 85 | | - **1NF**: Табелата е во **1NF** бидејќи сите атрибути содржат атомски вредности и нема дупликат вредности. |
| 86 | | - **2NF**: Табелата е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч составен од {{{order_id}}} и {{{batch_id}}}. |
| 87 | | - **BCNF**: Табелата е во **BCNF** бидејќи нема транзитивни релации и сите релации се од примарните клучеви. |
| 88 | | |
| 89 | | Табелата {{{ORDER_BATCHES}}} е нов додаток во базата кој овозможува детален и прецизен запис на сериите кои се дел од некоја нарачка. Ова ја заменува претходната едноставна табела {{{ORDER_PRODUCT}}} и го подобрува групирањето на производите. |
| 90 | | |
| 91 | | = Invoices |
| 92 | | |
| 93 | | Оваа табела е отстранета, бидејќи е редундантна. Содржи информации кои се повторуваат. Иницијално, целта на {{INVOICES}} табелата беше да се креира ставка за фактура во базата, но по многу размислување, одлучено беше тотално да се отстрани оваа табела, заедно со {{{PACKING_LISTS}}} табелата, бидејќи фактура може динамички да се генерира од {{{ORDERS}}} табелата. |
| 94 | | |
| 95 | | = Packing Lists |
| 96 | | |
| 97 | | Причината е иста како за {{{INVOICES}}} табелата. |
| 98 | | |
| 99 | | = Payments |
| 100 | | |
| 101 | | {{{PAYMENTS(id, order_id* (ORDERS), amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status)}}} |
| 102 | | |
| 103 | | {{{id → order_id, amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status}}} |
| 104 | | |
| 105 | | - **1NF**: Табелата е во **1NF** бидејќи сите атрибути содржат атомски вредности и нема дупликат вредности. |
| 106 | | - **2NF**: Табелата е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч. Надворешниот клуч {{{order_id}}} не создава делумни релации. |
| 107 | | - **BCNF**: Табелата е во **BCNF** бидејќи сите атрибути зависат целосно од примарниот клуч и нема транзитивни релации. |
| | 175 | {{{R2(id, name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address)}}} |
| | 176 | |
| | 177 | === {{{PRODUCER}}} |
| | 178 | |
| | 179 | {{{producer_id → address, country, phone_number, email}}} |
| | 180 | |
| | 181 | {{{R3(producer_id, address, country, phone_number, email)}}} |
| | 182 | |
| | 183 | === {{{PRODUCT}}} |
| | 184 | |
| | 185 | {{{product_id → name, description, hs_code, price, unit_of_measure}}} |
| | 186 | |
| | 187 | {{{R4(product_id, name, description, hs_code, price, unit_of_measure)}}} |
| | 188 | |
| | 189 | === {{{BATCH}}} |
| | 190 | |
| | 191 | {{{batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch}}} |
| | 192 | |
| | 193 | {{{R5(batch_id, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch)}}} |
| | 194 | |
| | 195 | === {{{TRANSPORT}}} |
| | 196 | |
| | 197 | {{{transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions}}} |
| | 198 | |
| | 199 | {{{R6(transport_id, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions)}}} |
| | 200 | |
| | 201 | === {{{ORDER}}} |
| | 202 | |
| | 203 | {{{order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id}}} |
| | 204 | |
| | 205 | {{{R7(order_id, date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id)}}} |
| | 206 | |
| | 207 | === {{{PAYMENT}}} |
| | 208 | |
| | 209 | {{{payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id}}} |
| | 210 | |
| | 211 | {{{R8(payment_id, amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id)}}} |
| | 212 | |
| | 213 | === {{{ORDER_BATCHES}}} |
| | 214 | |
| | 215 | {{{order_batch_id → quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id}}} |
| | 216 | |
| | 217 | {{{R9(order_batch_id, quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id)}}} |
| | 218 | |
| | 219 | == Проверка на нормалната форма после првата декомпозиција |
| | 220 | |
| | 221 | === {{{USER}}} |
| | 222 | |
| | 223 | Атрибути |
| | 224 | |
| | 225 | {{{id, name, email, password, is_admin}}} |
| | 226 | |
| | 227 | Функционални зависности |
| | 228 | |
| | 229 | {{{id → name, email, password, is_admin}}} |
| | 230 | |
| | 231 | Кандидатен клуч: {{{id}}} |
| | 232 | |
| | 233 | Оваа релација е во {{{2NF}}} бидејќи не постојат парцијални зависности. |
| | 234 | |
| | 235 | За постигнување {{{3NF}}}, не се јавуваат транзитивни зависности, така да оваа |
| | 236 | релација е во {{{3NF}}}. |
| | 237 | |
| | 238 | Исто така, бидејќи id е кандидатен клуч, релацијата е и во {{{BCNF}}}. |
| | 239 | |
| | 240 | === {{{CLIENT}}} |
| | 241 | |
| | 242 | Атрибути |
| | 243 | |
| | 244 | {{{id, name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address}}} |
| | 245 | |
| | 246 | Функционални зависности |
| | 247 | |
| | 248 | {{{id → name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address}}} |
| | 249 | |
| | 250 | Кандидатен клуч {{{id}}} |
| | 251 | |
| | 252 | Оваа релација е во {{{2NF}}} и не се појавуваат транзитивни зависности, така да е во {{{3NF}}} и во {{{BCNF}}}. |
| | 253 | |
| | 254 | === {{{PRODUCER}}} |
| | 255 | |
| | 256 | Атрибути |
| | 257 | |
| | 258 | {{{producer_id, address, country, phone_number, email}}} |
| | 259 | |
| | 260 | Функционални зависности |
| | 261 | |
| | 262 | {{{producer_id → address, country, phone_number, email}}} |
| | 263 | |
| | 264 | Кандидатен клуч {{{producer_id}}} |
| | 265 | |
| | 266 | И оваа релација е во {{{2NF}}}, {{{3NF}}} и {{{BCNF}}}. |
| | 267 | |
| | 268 | === {{{PRODUCT}}} |
| | 269 | |
| | 270 | Атрибути |
| | 271 | |
| | 272 | {{{product_id, name, description, hs_code, price, unit_of_measure}}} |
| | 273 | |
| | 274 | Функционални зависности |
| | 275 | |
| | 276 | {{{product_id → name, description, hs_code, price, unit_of_measure}}} |
| | 277 | |
| | 278 | Кандидатен клуч {{{product_id}}} |
| | 279 | |
| | 280 | Оваа релација е во {{{2NF}}}, {{{3NF}}} и {{{BCNF}}}. |
| | 281 | |
| | 282 | === {{{BATCH}}} |
| | 283 | |
| | 284 | Атрибути |
| | 285 | |
| | 286 | {{{batch_id, batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch}}} |
| | 287 | |
| | 288 | Функционални зависности |
| | 289 | |
| | 290 | {{{batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch}}} |
| | 291 | |
| | 292 | Кандидатен клуч {{{batch_id}}} |
| | 293 | |
| | 294 | Релацијата е во {{{2NF}}}, {{{3NF}}} и {{{BCNF}}}. |
| | 295 | |
| | 296 | === {{{TRANSPORT}}} |
| | 297 | |
| | 298 | Атрибути |
| | 299 | |
| | 300 | {{{transport_id, departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions}}} |
| | 301 | |
| | 302 | Функционални зависности |
| | 303 | |
| | 304 | {{{transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions}}} |
| | 305 | |
| | 306 | Кандидатен клуч {{{transport_id}}} |
| | 307 | |
| | 308 | Оваа релација е во {{{2NF}}}, {{{3NF}}} и {{{BCNF}}}. |
| | 309 | |
| | 310 | === {{{ORDER}}} |
| | 311 | |
| | 312 | Атрибути |
| | 313 | |
| | 314 | {{{order_id, date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id}}} |
| | 315 | |
| | 316 | Функционални зависности |
| | 317 | |
| | 318 | {{{order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id}}} |
| | 319 | |
| | 320 | Кандидатен клуч {{{order_id}}} |
| | 321 | |
| | 322 | Релацијата е во {{{2NF}}}, {{{3NF}}} и {{{BCNF}}}. |
| | 323 | |
| | 324 | === {{{PAYMENT}}} |
| | 325 | |
| | 326 | Атрибути |
| | 327 | |
| | 328 | {{{payment_id, amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id}}} |
| | 329 | |
| | 330 | Функционални зависности |
| | 331 | |
| | 332 | {{{payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id}}} |
| | 333 | |
| | 334 | Кандидатен клуч {{{payment_id}}} |
| | 335 | |
| | 336 | Релацијата е во {{{2NF}}}, {{{3NF}}} и {{{BCNF}}}. |
| | 337 | |
| | 338 | === {{{ORDER_BATCHES}}} |
| | 339 | |
| | 340 | Атрибути |
| | 341 | |
| | 342 | {{{order_batch_id, quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id}}} |
| | 343 | |
| | 344 | Функционални зависности |
| | 345 | |
| | 346 | {{{order_batch_id → quantity, price_per_unit, total_price, created_at, updated_at, order_id, batch_id}}} |
| | 347 | |
| | 348 | Кандидатен клуч {{{order_batch_id}}} |
| | 349 | |
| | 350 | Релацијата е во {{{2NF}}}, {{{3NF}}} и {{{BCNF}}}. |