Changes between Version 9 and Version 10 of Normalization


Ignore:
Timestamp:
09/30/25 21:17:39 (2 weeks ago)
Author:
211561
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v9 v10  
    1 = Users
    2 
    3 {{{USERS(id, name, email, password, is_admin)}}}
     1= Функционални зависности =
     2
     3Дадена е релационата шема за базата на податоци која ја креиравме, која може да
     4се претстави во една релација со сите атрибути од сите релации споени заедно.
     5Секако, дупликатите ќе бидат отстранети при тоа што ова не претставува проблем.
     6Нека {{{R}}} биде релацијата опишана како што следи:
     7
     8{{{
     9R(
     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
     241. {{{id → name, email, password, is_admin}}}
     25
     262. {{{producer_id → address, country, phone_number, email}}}
     27
     283. {{{product_id → name, description, hs_code, price, unit_of_measure}}}
     29
     304. {{{batch_id → batch_code, production_date, expiration_date, net_weight, gross_weight, units_per_batch}}}
     31
     325. {{{transport_id → departure_point, arrival_point, estimated_departure_date, estimated_arrival_date, incoterm, insurance_conditions}}}
     33
     346. {{{order_id → date, status, estimated_delivery_date, buyer_id, receiver_id, transport_id}}}
     35
     367. {{{payment_id → amount, currency, due_date, exchange_rate, payment_date, payment_method, payment_status, order_id}}}
     37
     388. {{{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
     489. {{{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{{{
     75name, email, password, is_admin, country, registration_number, tax_code,
     76contact_person, phone_number, billing_address, shipping_address, description,
     77hs_code, price, unit_of_measure, batch_code, production_date, expiration_date,
     78net_weight, gross_weight, units_per_batch, departure_point, arrival_point,
     79estimated_departure_date, estimated_arrival_date, incoterm,
     80insurance_conditions, status, estimated_delivery_date, currency, due_date,
     81exchange_rate, payment_date, payment_method, payment_status, quantity,
     82price_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{{{
     102X+ = {
     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,
     117transport_id, payment_id, product_id, batch_id}}}}, ќе добиеме следната
     118атрибутна затвореност:
     119
     120{{{
     121Y+ = {
     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}}}
    4166
    5167{{{id → name, email, password, is_admin}}}
    6168
    7 - **1NF**: Табелата е во **1NF** бидејќи секое поле содржи атомски вредности и нема дупликат вредности.
    8 - **2NF**: Табелата е во **2NF** бидејќи сите атрибути зависат целосно од примарниот клуч и нема делумни релации.
    9 - **BCNF**: Табелата е во **BCNF** бидејќи секоја релација е целосно зависна од примарниот клуч и нема транзитивни релации.
    10 
    11 = Clients
    12 
    13 {{{CLIENTS(id, name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address)}}}
     169{{{R1(id, name, email, password, is_admin)}}}
     170
     171=== {{{CLIENT}}}
    14172
    15173{{{id → name, country, registration_number, tax_code, contact_person, phone_number, billing_address, shipping_address}}}
    16174
    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}}}.