Changes between Initial Version and Version 1 of Normalization


Ignore:
Timestamp:
09/24/26 02:02:10 (7 days ago)
Author:
201178
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v1 v1  
     1= Нормализација =
     2
     3== Денормализирана форма ==
     4
     5Форма во која има една табела во која се внесени сите ентитети и нивните релации помеѓу себе, без никакви правила.
     6
     7Во денормализираната форма сите атрибути од сите 20 табели се обединети во една глобална релација. Поради големиот број на атрибути (над 50), таа не може практично да се прикаже како хоризонтална табела. Затоа, еден примерок ред е прикажан вертикално:
     8
     9|| '''Колона''' || '''Вредност''' ||
     10|| user_id || 3 ||
     11|| username || petar_waiter ||
     12|| password_hash || $2a$06$... ||
     13|| role_id || 3 ||
     14|| role_name || WAITER ||
     15|| session_token || a1b2c3d4-... ||
     16|| shift_id || 1 ||
     17|| shift_start || 2026-01-10 08:00 ||
     18|| shift_end || 2026-01-10 16:00 ||
     19|| shift_close_id || 1 ||
     20|| closed_by || 1 ||
     21|| total || 12234.35 ||
     22|| order_count || 18 ||
     23|| table_id || 1 ||
     24|| table_number || 1 ||
     25|| capacity || 4 ||
     26|| table_status || СЛОБОДНА ||
     27|| order_id || 43 ||
     28|| order_status || ПЛАТЕНА ||
     29|| order_created || 2026-07-10 14:47 ||
     30|| item_number || 1 ||
     31|| product_id || 14 ||
     32|| product_name || Безкофеинско Еспресо ||
     33|| price || 70.00 ||
     34|| quantity || 1 ||
     35|| unit_price || 70.00 ||
     36|| item_status || ПОРАЧАНО ||
     37|| category_id || 1 ||
     38|| category_name || Кафе ||
     39|| payment_id || 63 ||
     40|| amount || 6.50 ||
     41|| method || КЕШ ||
     42|| payment_date || 2026-07-10 14:47 ||
     43|| invoice_id || 39 ||
     44|| invoice_number || INV-43 ||
     45|| issued_at || 2026-07-10 14:47 ||
     46|| ingredient_id || 1 ||
     47|| ingredient_name || Кафе во зрно ||
     48|| unit || g ||
     49|| min_stock || 500 ||
     50|| recipe_id || 1 ||
     51|| recipe_item_qty || 8 ||
     52|| inv_id || 1 ||
     53|| inv_change || -1 ||
     54|| inv_op || ПРОДАЖБА ||
     55|| log_id || 1 ||
     56|| log_action || LOGIN ||
     57|| log_entity || app_user ||
     58|| log_created || 2026-07-07 ||
     59|| setting_id || 1 ||
     60|| restaurant_name || ЕМПОРИО ||
     61|| vat_rate || 18.00 ||
     62|| currency || ден ||
     63
     64Во денормализираната табела постојат следниве основни функционални зависности:
     65
     66 * {user_id} → {username, password_hash, role_id, active}
     67 * {role_id} → {role_name, description}
     68 * {session_token} → {user_id, created_at, expires_at}
     69 * {shift_id} → {user_id, start_time, end_time}
     70 * {shift_close_id} → {shift_id, closed_by, total, order_count, closed_at}
     71 * {table_id} → {table_number, capacity, status}
     72 * {order_id} → {user_id, table_id, created_at, status}
     73 * {order_id, item_number} → {product_id, quantity, unit_price, status}
     74 * {product_id} → {category_id, name, description, price, active, min_stock}
     75 * {category_id} → {name, description, active}
     76 * {payment_id} → {order_id, amount, method, payment_date}
     77 * {invoice_id} → {payment_id, invoice_number, issued_at}
     78 * {ingredient_id} → {name, unit, min_stock, active}
     79 * {recipe_id} → {product_id}
     80 * {recipe_id, ingredient_id} → {quantity_needed}
     81 * {inventory_id} → {product_id, quantity_change, operation_type, created_at}
     82 * {ingredient_inventory_id} → {ingredient_id, quantity_change, operation_type, created_at}
     83 * {log_id} → {user_id, action, entity_name, created_at}
     84 * {setting_id} → {restaurant_name, vat_rate, currency}
     85
     86== Прва нормална форма (1NF) ==
     87
     88Форма во која повторно има една табела, но овојпат таа е ограничена со следниве правила:
     89
     90 * Подредувањето на редовите не претставува никакво значење
     91 * Во ќелиите на секоја колона има по една вредност
     92 * Не се мешаат типови на податоци во една ќелија
     93 * Табелата има примарен композитен клуч
     94 * Нема повторувачки групи
     95
     96Примарен композитен клуч: (user_id, order_id, item_number, payment_id, invoice_id, ingredient_id, recipe_id, inventory_id, ingredient_inventory_id, log_id, shift_id, shift_close_id, session_token, table_id, category_id, role_id, setting_id)
     97
     98Овој клуч уникатно го идентификува секој ред бидејќи комбинира ги сите клучеви на ентитетите.
     99
     100=== Избор на примарен клуч во 1NF ===
     101
     102Поради големиот број на атрибути и сложеноста, композитниот клуч е многу голем. Ова е нормално за денормализирана форма и ќе се намали со декомпозиција.
     103
     104== Втора нормална форма (2NF) ==
     105
     106Форма која ги следи овие правила:
     107
     108 * Веќе е во прва нормална форма
     109 * Секој атрибут кој не е клуч, зависи од целосниот примарен клуч (нема парцијални зависности)
     110
     111=== Проблем во 1NF: парцијални зависности ===
     112
     113Во 1NF постојат атрибути кои зависат само од дел од примарниот клуч:
     114
     115 * {user_id} → {username, password_hash, role_id, active}
     116 * {role_id} → {role_name, description}
     117 * {session_token} → {user_id, created_at, expires_at}
     118 * {shift_id} → {user_id, start_time, end_time}
     119 * {table_id} → {table_number, capacity, status}
     120 * {order_id} → {user_id, table_id, created_at, status}
     121 * {product_id} → {category_id, name, description, price, active, min_stock}
     122 * {category_id} → {name, description, active}
     123 * {payment_id} → {order_id, amount, method, payment_date}
     124 * {invoice_id} → {payment_id, invoice_number, issued_at}
     125 * {ingredient_id} → {name, unit, min_stock, active}
     126 * {recipe_id} → {product_id}
     127 * {inventory_id} → {product_id, quantity_change, operation_type, created_at}
     128 * {ingredient_inventory_id} → {ingredient_id, quantity_change, operation_type, created_at}
     129 * {log_id} → {user_id, action, entity_name, created_at}
     130 * {setting_id} → {restaurant_name, vat_rate, currency}
     131 * {shift_close_id} → {shift_id, closed_by, total, order_count, closed_at}
     132
     133Ова ја крши 2NF. Решение: декомпозиција - секоја група на атрибути која зависи од дел од композитниот клуч се издвојува во посебна табела каде тој дел станува примарен клуч.
     134
     135=== R1: ROLE ===
     136
     137{role_id} → {role_name, description}
     138
     139|| role_id || role_name || description ||
     140|| 1 || ADMIN || System administrator ||
     141|| 2 || WAITER || Restaurant waiter ||
     142|| 3 || MANAGER || Restaurant manager ||
     143
     144'''Lossless join test:'''
     145
     146R ∩ R1 = {role_id, role_name, description}
     147
     148Бидејќи {role_id} → {role_name, description}, а role_id ∈ (R ∩ R1), следи дека (R ∩ R1) → R1.
     149
     150⇒ Декомпозицијата е lossless.
     151
     152R1.1 = R - {role_name, description}
     153
     154=== R2: APP_USER ===
     155
     156{user_id} → {username, password_hash, role_id, first_name, last_name, email, active}
     157
     158|| user_id || username || password_hash || role_id || first_name || last_name || email || active ||
     159|| 1 || admin || $2a$06$... || 1 || Georgi || Admin || admin@pos.com || f ||
     160|| 2 || marko || $2a$06$... || 2 || Marko || Petrov || marko@pos.com || f ||
     161|| 6 || (null) || $2a$06$... || 1 || Георги || Паунков || (null) || t ||
     162|| 7 || (null) || $2a$06$... || 2 || Georgi || Paunkov || (null) || t ||
     163
     164'''Lossless join test:'''
     165
     166R1.1 ∩ R2 = {user_id, username, password_hash, role_id, first_name, last_name, email, active}
     167
     168Бидејќи {user_id} → {username, password_hash, role_id, first_name, last_name, email, active}, а user_id ∈ (R1.1 ∩ R2), следи дека (R1.1 ∩ R2) → R2.
     169
     170⇒ Декомпозицијата е lossless.
     171
     172R2.1 = R1.1 - {username, password_hash, role_id, first_name, last_name, email, active}
     173
     174=== R3: SESSION ===
     175
     176{session_token} → {user_id, created_at, expires_at}
     177
     178|| token || user_id || created_at || expires_at ||
     179
     180(празна табела)
     181
     182'''Lossless join test:'''
     183
     184R2.1 ∩ R3 = {session_token, user_id, created_at, expires_at}
     185
     186Бидејќи {session_token} → {user_id, created_at, expires_at}, а session_token ∈ (R2.1 ∩ R3), следи дека (R2.1 ∩ R3) → R3.
     187
     188⇒ Декомпозицијата е lossless.
     189
     190R3.1 = R2.1 - {user_id, created_at, expires_at}
     191
     192=== R4: SHIFT ===
     193
     194{shift_id} → {user_id, start_time, end_time}
     195
     196|| shift_id || user_id || start_time || end_time ||
     197|| 1 || 2 || 2026-01-10 08:00:00 || 2026-01-10 16:00:00 ||
     198
     199'''Lossless join test:'''
     200
     201R3.1 ∩ R4 = {shift_id, user_id, start_time, end_time}
     202
     203Бидејќи {shift_id} → {user_id, start_time, end_time}, а shift_id ∈ (R3.1 ∩ R4), следи дека (R3.1 ∩ R4) → R4.
     204
     205⇒ Декомпозицијата е lossless.
     206
     207R4.1 = R3.1 - {user_id, start_time, end_time}
     208
     209=== R5: RESTAURANT_TABLE ===
     210
     211{table_id} → {table_number, capacity, status}
     212
     213|| table_id || table_number || capacity || status ||
     214|| 1 || 1 || 4 || СЛОБОДНА ||
     215|| 2 || 2 || 4 || СЛОБОДНА ||
     216|| 3 || 3 || 6 || СЛОБОДНА ||
     217|| 4 || 4 || 4 || СЛОБОДНА ||
     218|| 5 || 5 || 4 || СЛОБОДНА ||
     219|| ... || ... || ... || ... ||
     220
     221'''Lossless join test:'''
     222
     223R4.1 ∩ R5 = {table_id, table_number, capacity, status}
     224
     225Бидејќи {table_id} → {table_number, capacity, status}, а table_id ∈ (R4.1 ∩ R5), следи дека (R4.1 ∩ R5) → R5.
     226
     227⇒ Декомпозицијата е lossless.
     228
     229R5.1 = R4.1 - {table_number, capacity, status}
     230
     231=== R6: CATEGORY ===
     232
     233{category_id} → {name, description, active}
     234
     235|| category_id || name || description || active ||
     236|| 1 || Кафе || (null) || t ||
     237|| 2 || Нес Кафе || (null) || t ||
     238|| 3 || Води || (null) || t ||
     239|| ... || ... || ... || ... ||
     240
     241'''Lossless join test:'''
     242
     243R5.1 ∩ R6 = {category_id, name, description, active}
     244
     245Бидејќи {category_id} → {name, description, active}, а category_id ∈ (R5.1 ∩ R6), следи дека (R5.1 ∩ R6) → R6.
     246
     247⇒ Декомпозицијата е lossless.
     248
     249R6.1 = R5.1 - {name, description, active}
     250
     251=== R7: PRODUCT ===
     252
     253{product_id} → {category_id, name, description, price, active, min_stock}
     254
     255|| product_id || category_id || name || description || price || active || min_stock ||
     256|| 1 || 1 || Еспресо Хаусбрандт || 100% Арабика || 70.00 || t || 0 ||
     257|| 2 || 1 || Макијато || 100% Арабика || 80.00 || t || 0 ||
     258|| ... || ... || ... || ... || ... || ... || ... ||
     259
     260'''Lossless join test:'''
     261
     262R6.1 ∩ R7 = {product_id, category_id, name, description, price, active, min_stock}
     263
     264Бидејќи {product_id} → {category_id, name, description, price, active, min_stock}, а product_id ∈ (R6.1 ∩ R7), следи дека (R6.1 ∩ R7) → R7.
     265
     266⇒ Декомпозицијата е lossless.
     267
     268R7.1 = R6.1 - {category_id, name, description, price, active, min_stock}
     269
     270=== R8: ORDERS ===
     271
     272{order_id} → {user_id, table_id, created_at, status}
     273
     274|| order_id || user_id || table_id || created_at || status ||
     275|| 43 || 1 || 1 || 2026-07-10 14:47:39 || ПЛАТЕНА ||
     276|| 44 || 1 || 1 || 2026-07-10 14:48:34 || ПЛАТЕНА ||
     277|| ... || ... || ... || ... || ... ||
     278
     279'''Lossless join test:'''
     280
     281R7.1 ∩ R8 = {order_id, user_id, table_id, created_at, status}
     282
     283Бидејќи {order_id} → {user_id, table_id, created_at, status}, а order_id ∈ (R7.1 ∩ R8), следи дека (R7.1 ∩ R8) → R8.
     284
     285⇒ Декомпозицијата е lossless.
     286
     287R8.1 = R7.1 - {user_id, table_id, created_at, status}
     288
     289=== R9: PAYMENT ===
     290
     291{payment_id} → {order_id, amount, method, payment_date}
     292
     293|| payment_id || order_id || amount || method || payment_date ||
     294|| 63 || 43 || 6.50 || КЕШ || 2026-07-10 14:47:43 ||
     295|| 64 || 44 || 6.50 || КЕШ || 2026-07-10 14:48:38 ||
     296|| ... || ... || ... || ... || ... ||
     297
     298'''Lossless join test:'''
     299
     300R8.1 ∩ R9 = {payment_id, order_id, amount, method, payment_date}
     301
     302Бидејќи {payment_id} → {order_id, amount, method, payment_date}, а payment_id ∈ (R8.1 ∩ R9), следи дека (R8.1 ∩ R9) → R9.
     303
     304⇒ Декомпозицијата е lossless.
     305
     306R9.1 = R8.1 - {order_id, amount, method, payment_date}
     307
     308=== R10: INVOICE ===
     309
     310{invoice_id} → {payment_id, invoice_number, issued_at}
     311
     312|| invoice_id || payment_id || invoice_number || issued_at ||
     313|| 39 || 63 || INV-43 || 2026-07-10 14:47:43 ||
     314|| 40 || 64 || INV-44 || 2026-07-10 14:48:38 ||
     315|| ... || ... || ... || ... ||
     316
     317'''Lossless join test:'''
     318
     319R9.1 ∩ R10 = {invoice_id, payment_id, invoice_number, issued_at}
     320
     321Бидејќи {invoice_id} → {payment_id, invoice_number, issued_at}, а invoice_id ∈ (R9.1 ∩ R10), следи дека (R9.1 ∩ R10) → R10.
     322
     323⇒ Декомпозицијата е lossless.
     324
     325R10.1 = R9.1 - {payment_id, invoice_number, issued_at}
     326
     327=== R11: INGREDIENT ===
     328
     329{ingredient_id} → {name, unit, min_stock, active}
     330
     331(празна табела)
     332
     333'''Lossless join test:'''
     334
     335R10.1 ∩ R11 = {ingredient_id, name, unit, min_stock, active}
     336
     337Бидејќи {ingredient_id} → {name, unit, min_stock, active}, а ingredient_id ∈ (R10.1 ∩ R11), следи дека (R10.1 ∩ R11) → R11.
     338
     339⇒ Декомпозицијата е lossless.
     340
     341R11.1 = R10.1 - {name, unit, min_stock, active}
     342
     343=== R12: RECIPE ===
     344
     345{recipe_id} → {product_id}
     346
     347(празна табела)
     348
     349'''Lossless join test:'''
     350
     351R11.1 ∩ R12 = {recipe_id, product_id}
     352
     353Бидејќи {recipe_id} → {product_id}, а recipe_id ∈ (R11.1 ∩ R12), следи дека (R11.1 ∩ R12) → R12.
     354
     355⇒ Декомпозицијата е lossless.
     356
     357R12.1 = R11.1 - {product_id}
     358
     359=== R13: INVENTORY ===
     360
     361{inventory_id} → {product_id, quantity_change, operation_type, created_at}
     362
     363|| inventory_id || product_id || quantity_change || operation_type || created_at ||
     364|| 1 || 14 || -1 || ПРОДАЖБА || 2026-07-10 17:17 ||
     365|| 2 || 51 || -1 || ПРОДАЖБА || 2026-07-10 17:31 ||
     366|| ... || ... || ... || ... || ... ||
     367
     368'''Lossless join test:'''
     369
     370R12.1 ∩ R13 = {inventory_id, product_id, quantity_change, operation_type, created_at}
     371
     372Бидејќи {inventory_id} → {product_id, quantity_change, operation_type, created_at}, а inventory_id ∈ (R12.1 ∩ R13), следи дека (R12.1 ∩ R13) → R13.
     373
     374⇒ Декомпозицијата е lossless.
     375
     376R13.1 = R12.1 - {product_id, quantity_change, operation_type, created_at}
     377
     378=== R14: INGREDIENT_INVENTORY ===
     379
     380{ingredient_inventory_id} → {ingredient_id, quantity_change, operation_type, created_at}
     381
     382(празна табела)
     383
     384'''Lossless join test:'''
     385
     386R13.1 ∩ R14 = {id, ingredient_id, quantity_change, operation_type, created_at}
     387
     388⇒ Декомпозицијата е lossless.
     389
     390R14.1 = R13.1 - {ingredient_id, quantity_change, operation_type, created_at}
     391
     392=== R15: AUDIT_LOG ===
     393
     394{log_id} → {user_id, action, entity_name, created_at}
     395
     396|| log_id || user_id || action || entity_name || created_at ||
     397|| 1 || 1 || Направен е продукт Еспресо || PRODUCT || 2026-07-07 14:45 ||
     398
     399'''Lossless join test:'''
     400
     401R14.1 ∩ R15 = {log_id, user_id, action, entity_name, created_at}
     402
     403⇒ Декомпозицијата е lossless.
     404
     405R15.1 = R14.1 - {user_id, action, entity_name, created_at}
     406
     407=== R16: APP_SETTINGS ===
     408
     409{id} → {restaurant_name, vat_rate, currency, printer_config}
     410
     411|| id || restaurant_name || vat_rate || currency || printer_config ||
     412|| 1 || Емпорио || 18.00 || ден || 2 ||
     413
     414'''Lossless join test:'''
     415
     416R15.1 ∩ R16 = {id, restaurant_name, vat_rate, currency, printer_config}
     417
     418⇒ Декомпозицијата е lossless.
     419
     420R16.1 = R15.1 - {restaurant_name, vat_rate, currency, printer_config}
     421
     422=== R17: SETTINGS ===
     423
     424{id} → {restaurant_name, vat_percent, currency, printer_ip, printer_port}
     425
     426|| id || restaurant_name || vat_percent || currency || printer_ip || printer_port ||
     427|| 1 || EMPORIO CAFFE || 18 || ден || (null) || 9100 ||
     428
     429'''Lossless join test:'''
     430
     431R16.1 ∩ R17 = {id, restaurant_name, vat_percent, currency, printer_ip, printer_port}
     432
     433⇒ Декомпозицијата е lossless.
     434
     435R17.1 = R16.1 - {restaurant_name, vat_percent, currency, printer_ip, printer_port}
     436
     437=== R18: ORDER_ITEM ===
     438
     439{order_id, item_number} → {product_id, quantity, unit_price, status}
     440
     441|| order_id || item_number || product_id || quantity || unit_price || status ||
     442|| 54 || 1 || 14 || 1 || 70.00 || ПОРАЧАНО ||
     443|| 55 || 1 || 51 || 1 || 70.00 || ПОРАЧАНО ||
     444|| ... || ... || ... || ... || ... || ... ||
     445
     446'''Lossless join test:'''
     447
     448R17.1 ∩ R18 = {order_id, item_number, product_id, quantity, unit_price, status}
     449
     450⇒ Декомпозицијата е lossless.
     451
     452=== R19: SHIFT_CLOSE ===
     453
     454{shift_id} → {closed_at, closed_by, total, order_count}
     455
     456|| shift_id || closed_at || closed_by || total || order_count ||
     457|| 1 || 2026-07-09 11:32 || 1 || 12234.35 || 18 ||
     458|| 2 || 2026-07-09 11:32 || 1 || 0 || 0 ||
     459|| ... || ... || ... || ... || ... ||
     460
     461'''Lossless join test:'''
     462
     463R18.1 ∩ R19 = {shift_id, closed_at, closed_by, total, order_count}
     464
     465⇒ Декомпозицијата е lossless.
     466
     467=== R20: RECIPE_ITEM ===
     468
     469{recipe_id, ingredient_id} → {quantity_needed}
     470
     471(празна табела)
     472
     473'''Lossless join test:'''
     474
     475R19.1 ∩ R20 = {recipe_id, ingredient_id, quantity_needed}
     476
     477⇒ Декомпозицијата е lossless.
     478
     479== Трета нормална форма (3NF) ==
     480
     481Форма која ги следи овие правила:
     482
     483 * Веќе е во втора нормална форма
     484 * Се отстрануваат транзитивните функционални зависности
     485
     486=== Проверка за транзитивни зависности ===
     487
     488Во 2NF, сите транзитивни зависности се веќе отстранети бидејќи секоја табела има само еден кандидат-клуч и сите не-клучни атрибути зависат директно од него.
     489
     490Единствена потенцијална транзитивна зависност:
     491
     492 * {recipe_id} → {product_id} → {category_id} (но recipe не содржи category_id, па нема транзитивност)
     493
     494Сите табели се веќе во 3NF.
     495
     496== BCNF (Boyce-Codd Normal Form) ==
     497
     498Форма која ги следи овие правила:
     499
     500 * Веќе е во трета нормална форма
     501 * За секоја функционална зависност X → Y, X мора да биде супер-клуч
     502
     503=== Проверка за BCNF ===
     504
     505Сите функционални зависности во сите табели имаат X кој е примарен клуч (или композитен клуч), што значи X е супер-клуч.
     506
     507Сите табели се веќе во BCNF.
     508
     509== Финални табели (BCNF) ==
     510
     511 # '''ROLE''' (role_id PK, role_name, description)
     512 # '''APP_USER''' (user_id PK, role_id FK, username, password_hash, first_name, last_name, email, active)
     513 # '''SESSION''' (token PK, user_id FK, created_at, expires_at)
     514 # '''SHIFT''' (shift_id PK, user_id FK, start_time, end_time)
     515 # '''SHIFT_CLOSE''' (shift_id PK, closed_at, closed_by FK, total, order_count)
     516 # '''RESTAURANT_TABLE''' (table_id PK, table_number, capacity, status)
     517 # '''CATEGORY''' (category_id PK, name, description, active)
     518 # '''PRODUCT''' (product_id PK, category_id FK, name, description, price, active, min_stock)
     519 # '''ORDERS''' (order_id PK, user_id FK, table_id FK, created_at, status)
     520 # '''ORDER_ITEM''' (order_id PK, item_number PK, product_id FK, quantity, unit_price, status)
     521 # '''PAYMENT''' (payment_id PK, order_id FK, amount, method, payment_date)
     522 # '''INVOICE''' (invoice_id PK, payment_id FK, invoice_number, issued_at)
     523 # '''INGREDIENT''' (ingredient_id PK, name, unit, min_stock, active)
     524 # '''RECIPE''' (recipe_id PK, product_id FK)
     525 # '''RECIPE_ITEM''' (recipe_id PK, ingredient_id PK, quantity_needed)
     526 # '''INVENTORY''' (inventory_id PK, product_id FK, quantity_change, operation_type, created_at)
     527 # '''INGREDIENT_INVENTORY''' (id PK, ingredient_id FK, quantity_change, operation_type, created_at)
     528 # '''AUDIT_LOG''' (log_id PK, user_id FK, action, entity_name, created_at)
     529 # '''APP_SETTINGS''' (id PK, restaurant_name, vat_rate, currency, printer_config)
     530 # '''SETTINGS''' (id PK, restaurant_name, vat_percent, currency, printer_ip, printer_port)
     531
     532== Заклучок ==
     533
     534Со примената на формална анализа на функционални зависности, правилен избор на примарни клучеви и проверка со lossless-join тест се елиминираат сите аномалии, се обезбедува логичка коректност и се добива шема погодна за имплементација во релациона датабаза.
     535
     536=== Разлики помеѓу нормализираниот дизајн и дизајнот од фаза P2 ===
     537
     538Нормализираниот дизајн **е идентичен** со дизајнот од фаза P2. Ова значи дека дизајнот од P2 беше веќе правилно нормализиран.
     539
     540Сите табели се во BCNF, сите функционални зависности се запазени, и сите декомпозиции се lossless.
     541
     542За следните фази на проектот **ќе се користи истиот дизајн** од P2, бидејќи е веќе целосно нормализиран.