Changes between Version 4 and Version 5 of Normalization


Ignore:
Timestamp:
01/14/26 03:29:44 (13 days ago)
Author:
221181
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v4 v5  
    33== Вовед ==
    44
    5 Целта на оваа анализа е да се прикаже процесот на нормализација за предложениот модел на базата на податоци Stock Master, од идентификација на функционалните зависимости до постигнување на BCNF (Boyce-Codd нормална форма). Анализата е изведена врз основа на ентитетите и релациите од ER моделот разработен во Фаза P1.
     5Целта на оваа анализа е да се прикаже процесот на нормализација за предложениот модел на базата на податоци Stock Master, од идентификација на функционалните зависиности до постигнување на BCNF (Boyce-Codd нормална форма). Анализата е изведена врз основа на ентитетите и релациите од ER моделот разработен во Фаза P2.
     6
     71.'''Академска валидност:''' Нормализација базирана на ентитети е стандардниот пристап за ER-to-релационо мапирање (Elmasri & Navathe, "Fundamentals of Database Systems")
     8
     9'''Заклучок:''' Ги нормализираме секоја релација на ентитет независно, потоа верификуваме релации преку ограничувања на надворешни клучеви.
     10
     11Користиме '''Пристап (Базиран на ентитети)''' затоа што:
     12
     132. '''Независни ентитети:''' Нашиот ER модел содржи ентитети кои претставуваат фундаментално различни бизнис концепти:
     14   - Sale (трансакциски настан)
     15   - !PurchaseOrder (различен трансакциски настан)
     16   - Product (инвентарна ставка)
     17   - User, Customer, Supplier (луѓе/организации)
     18
     193. '''Нема природно комбинирачко настан:''' Не постои еден реален настан каде што сите ентитети учествуваат истовремено:
     20   - Sale НЕ има !PurchaseOrder
     21   - !PurchaseOrder НЕ има Sale
     22   - Product може да постои без било кој од нив
     23
     24== Дел 1: Нормализација базирана на ентитети ==
     25
     26=== Ентитет 1: USER ===
     27
     28==== Почетна релациска шема ====
     29
     30'''User'''(userId, username, password, full_name, email, role, is_active)
     31
     32==== Функционални зависиности ====
     33
     34'''FD1:''' userId → username, password, full_name, email, role, is_active
     35
     36'''Образложение:''' userId уникатно идентификува корисник, и сите други атрибути опишуваат својства на тој конкретен корисник.
     37
     38==== Анализа на кандидатски клучеви ====
     39
     40'''Чекор 1: Идентификуваме атрибути што никогаш не се на десната страна на FDs'''
     41- userId: се појавува само на левата страна
     42
     43'''Чекор 2: Пресметуваме затвореност'''
     44{userId}⁺ = {userId, username, password, full_name, email, role, is_active}
     45
     46Сите атрибути се детерминирани
     47
     48'''Чекор 3: Тестираме минималност'''
     49- Само еден атрибут во клучот, автоматски минимален
     50
     51'''Кандидатски клучеви:''' {userId}
     52
     53'''Примарен клуч:''' userId
     54
     55==== Чекори на нормализација ====
     56
     57'''1NF проверка:'''
     58- Сите атрибути атомарни (нема повеќе-вредносни или композитни атрибути)
     59- Примарен клуч дефиниран
     60- Нема повторувачки групи
     61
     62'''Заклучок: User е во 1NF'''
     63
     64'''2NF проверка:'''
     65- Примарниот клуч е еден атрибут
     66- Парцијални зависиности невозможни со еден-атрибутски клуч
     67- Автоматски во 2NF
     68
     69'''Заклучок: User е во 2NF'''
     70
     71'''3NF проверка:'''
     72- Тест за транзитивни зависиности (непримарен → непримарен):
     73  - username → password? НЕ (корисничките имиња не детерминираат лозинки)
     74  - username → full_name? НЕ (корисничките имиња не идентификуваат луѓе уникатно)
     75  - username → email? НЕ
     76  - email → username? НЕ (email-овите не детерминираат кориснички имиња)
     77  - role → (било кој друг атрибут)? НЕ (role е категорија, не детерминант)
     78  - Не постојат транзитивни зависиности
     79
     80'''Заклучок: User е во 3NF'''
     81
     82'''BCNF проверка:'''
     83- За секоја FD X → Y, дали X е суперклуч?
     84- FD1: userId → {...}
     85- Дали userId е суперклуч? ДА (тој е кандидатскиот клуч)
     86
     87'''Заклучок: User е во BCNF'''
     88
     89==== Финална шема ====
     90
     91'''User'''(userId, username, password, full_name, email, role, is_active)
     92- '''PK:''' userId
     93- '''Нормална форма:''' BCNF
     94
     95=== Ентитет 2: CUSTOMER ===
     96
     97==== Почетна релациска шема ====
     98
     99'''Customer'''(customerId, name, email, phone, address)
     100
     101==== Функционални зависиности ====
     102
     103'''FD2:''' customerId → name, email, phone, address
     104
     105'''Образложение:''' customerId уникатно идентификува клиент, и сите други атрибути опишуваат својства на тој конкретен клиент.
     106
     107==== Анализа на кандидатски клучеви ====
     108
     109{customerId}⁺ = {customerId, name, email, phone, address}
     110
     111'''Кандидатски клучеви:''' {customerId}
     112
     113'''Примарен клуч:''' customerId
     114
     115==== Чекори на нормализација ====
     116
     117'''1NF:'''  Атомарни атрибути
     118
     119'''2NF:'''  Еден-атрибутски клуч
     120
     121'''3NF проверка:'''
     122- Не постојат транзитивни зависиности
     123
     124'''BCNF проверка:'''
     125- FD2: customerId е суперклуч
     126
     127==== Финална шема ====
     128
     129'''Customer'''(customerId, name, email, phone, address)
     130- '''PK:''' customerId
     131- '''Нормална форма:''' BCNF
     132
     133=== Ентитет 3: CATEGORY ===
     134
     135==== Почетна релациска шема ====
     136
     137'''Category'''(categoryId, name, description)
     138
     139==== Функционални зависиности ====
     140
     141'''FD3:''' categoryId → name, description
     142
     143==== Анализа на кандидатски клучеви ====
     144
     145{categoryId}⁺ = {categoryId, name, description}
     146
     147'''Кандидатски клучеви:''' {categoryId}
     148
     149'''Примарен клуч:''' categoryId
     150
     151==== Финална шема ====
     152
     153'''Category'''(categoryId, name, description)
     154- '''PK:''' categoryId
     155- '''Нормална форма:''' BCNF
     156
     157=== Ентитет 4: SUPPLIER ===
     158
     159==== Почетна релациска шема ====
     160
     161'''Supplier'''(supplierId, name, contact_person, phone, email, address)
     162
     163==== Функционални зависиности ====
     164
     165'''FD4:''' supplierId → name, contact_person, phone, email, address
     166
     167==== Анализа на кандидатски клучеви ====
     168
     169{supplierId}⁺ = {supplierId, name, contact_person, phone, email, address}
     170
     171'''Кандидатски клучеви:''' {supplierId}
     172
     173'''Примарен клуч:''' supplierId
     174
     175==== Финална шема ====
     176
     177'''Supplier'''(supplierId, name, contact_person, phone, email, address)
     178- '''PK:''' supplierId
     179- '''Нормална форма:''' BCNF
     180
     181=== Ентитет 5: WAREHOUSE ===
     182
     183==== Почетна релациска шема ====
     184
     185'''Warehouse'''(warehouseId, name, location, capacity)
     186
     187==== Функционални зависиности ====
     188
     189'''FD5:''' warehouseId → name, location, capacity
     190
     191==== Анализа на кандидатски клучеви ====
     192
     193{warehouseId}⁺ = {warehouseId, name, location, capacity}
     194
     195'''Кандидатски клучеви:''' {warehouseId}
     196
     197'''Примарен клуч:''' warehouseId
     198
     199==== Финална шема ====
     200
     201'''Warehouse'''(warehouseId, name, location, capacity)
     202- '''PK:''' warehouseId
     203- '''Нормална форма:''' BCNF
     204
     205=== Ентитет 6: PRODUCT ===
     206
     207==== Почетна релациска шема ====
     208
     209'''Product'''(productId, name, description, sku, unit_price, reorder_level, categoryId, supplierId)
     210
     211==== Функционални зависиности ====
     212
     213'''FD6:''' productId → name, description, sku, unit_price, reorder_level, categoryId, supplierId
     214
     215'''FD7:''' sku → productId, name, description, unit_price, reorder_level, categoryId, supplierId
     216
     217'''Образложение:''' ER моделот специфицира дека '''и productId и sku се уникатни идентификатори'''
     218
     219==== Анализа на кандидатски клучеви ====
     220
     221'''Тест productId:'''
     222{productId}⁺ = {productId, name, description, sku, unit_price, reorder_level, categoryId, supplierId}
     223- Сите атрибути детерминирани
     224- Минимален
     225
     226'''Тест sku:'''
     227{sku}⁺ = {sku, productId, name, description, unit_price, reorder_level, categoryId, supplierId}
     228- Сите атрибути детерминирани
     229- Минимален
     230
     231'''Кандидатски клучеви:''' {productId}, {sku}
     232
     233'''Примарен клуч:''' productId
     234
     235'''Алтернативен клуч:''' sku
     236
     237==== Чекори на нормализација ====
     238
     239'''3NF проверка:'''
     240
     241'''Важно: Надворешни клучеви vs. Транзитивни зависиности'''
     242
     243Оваа релација содржи '''categoryId''' и '''supplierId''' кои се надворешни клучеви.
     244
     245'''Прашање:''' Дали овие создаваат транзитивни зависиности?
     246
     247'''Одговор:''' НЕ
     248
     249'''Објаснување:''' Надворешните клучеви се '''индикатори на релации''', не транзитивни зависиности. Вистинските зависни атрибути (category_name, supplier_name) се складирани во нивните соодветни релации (Category, Supplier), одржувајќи ја нормализацијата.
     250
     251'''Product е во BCNF'''
     252
     253==== Финална шема ====
     254
     255'''Product'''(productId, name, description, sku, unit_price, reorder_level, categoryId, supplierId)
     256
     257- '''PK:''' productId
     258
     259- '''AK:''' sku
     260
     261- '''FK:''' categoryId → Category(categoryId)
     262
     263- '''FK:''' supplierId → Supplier(supplierId)
     264
     265- '''Нормална форма:''' BCNF
     266
     267=== Ентитет 7: SALE ===
     268
     269==== Почетна релациска шема ====
     270
     271'''Sale'''(saleId, date_time, total_amount, userId, customerId, warehouseId)
     272
     273==== Функционални зависиности====
     274
     275'''FD8:''' saleId → date_time, total_amount, userId, customerId, warehouseId
     276
     277==== Анализа на кандидатски клучеви ====
     278
     279{saleId}⁺ = {saleId, date_time, total_amount, userId, customerId, warehouseId}
     280
     281'''Кандидатски клучеви:''' {saleId}
     282
     283'''Примарен клуч:''' saleId
     284
     285==== Финална шема ====
     286
     287'''Sale'''(saleId, date_time, total_amount, userId, customerId, warehouseId)
     288
     289- '''PK:''' saleId
     290
     291- '''FK:''' userId → User(userId)
     292
     293- '''FK:''' customerId → Customer(customerId)
     294
     295- '''FK:''' warehouseId → Warehouse(warehouseId)
     296
     297- '''Нормална форма:''' BCNF
     298
     299=== Ентитет 8: PURCHASEORDER ===
     300
     301==== Почетна релациска шема ====
     302
     303'''!PurchaseOrder'''(poId, order_date, expected_delivery_date, status, supplierId, warehouseId)
     304
     305==== Функционални зависиности ====
     306
     307'''FD9:''' poId → order_date, expected_delivery_date, status, supplierId, warehouseId
     308
     309==== Анализа на кандидатски клучеви ====
     310
     311{poId}⁺ = {poId, order_date, expected_delivery_date, status, supplierId, warehouseId}
     312
     313'''Кандидатски клучеви:''' {poId}
     314
     315'''Примарен клуч:''' poId
     316
     317==== Финална шема ====
     318
     319'''!PurchaseOrder'''(poId, order_date, expected_delivery_date, status, supplierId, warehouseId)
     320
     321- '''PK:''' poId
     322
     323- '''FK:''' supplierId → Supplier(supplierId)
     324
     325- '''FK:''' warehouseId → Warehouse(warehouseId)
     326
     327- '''Нормална форма:''' BCNF
     328
     329=== Ентитет 9: SALEITEM (Слаб ентитет) ===
     330
     331==== Почетна релациска шема ====
     332
     333'''!SaleItem'''(saleId, productId, quantity, unit_price_at_sale)
     334
     335==== Функционални зависиности ====
     336
     337'''FD10:''' (saleId, productId) → quantity, unit_price_at_sale
     338
     339==== Анализа на кандидатски клучеви ====
     340
     341'''Тест (saleId, productId):'''
     342
     343{saleId, productId}⁺ = {saleId, productId, quantity, unit_price_at_sale}
     344
     345- Сите атрибути детерминирани
     346
     347- Двата компоненти неопходни
     348
     349'''Кандидатски клучеви:''' {(saleId, productId)}
     350
     351'''Примарен клуч:''' (saleId, productId)
     352
     353==== Чекори на нормализација ====
     354
     355'''2NF проверка:'''
     356
     357Нема парцијални зависиности. Двата непримарни атрибути (quantity, unit_price_at_sale) бараат '''ЦЕЛОСЕН композитен клуч''' (saleId, productId) за детерминација.
     358
     359'''!SaleItem е во 2NF'''
     360
     361'''3NF проверка:'''
     362
     363Не постојат транзитивни зависиности
     364
     365'''!SaleItem е во 3NF'''
     366
     367'''BCNF проверка:'''
     368- FD10: (saleId, productId) е суперклуч
     369
     370'''!SaleItem е во BCNF'''
     371
     372==== Карактеристики на слаб ентитет ====
     373
     3741. '''Зависимост од постоење:''' !SaleItem не може да постои без родителска Sale
     375
     3762. '''Идентификувачка релација:''' Надворешниот клуч (saleId) е дел од примарниот клуч
     377
     3783. '''Парцијален клуч:''' productId ги разликува различните производи во иста продажба
     379
     380==== Финална шема ====
     381
     382'''!SaleItem'''(saleId, productId, quantity, unit_price_at_sale)
     383
     384- '''PK:''' (saleId, productId)
     385
     386- '''FK:''' saleId → Sale(saleId) - '''идентификувачка'''
     387
     388- '''FK:''' productId → Product(productId)
     389
     390- '''Тип на ентитет:''' Слаб ентитет (зависен од Sale)
     391
     392- '''Нормална форма:''' BCNF
     393
     394=== Ентитет 10: PURCHASEORDERITEM (Слаб ентитет) ===
     395
     396==== Почетна релациска шема ====
     397
     398'''!PurchaseOrderItem'''(poId, productId, quantity, unit_cost)
     399
     400==== Функционални зависиности ====
     401
     402'''FD11:''' (poId, productId) → quantity, unit_cost
     403
     404==== Анализа на кандидатски клучеви ====
     405
     406{poId, productId}⁺ = {poId, productId, quantity, unit_cost}
     407
     408'''Кандидатски клучеви:''' {(poId, productId)}
     409
     410'''Примарен клуч:''' (poId, productId)
     411
     412==== Финална шема ====
     413
     414'''!PurchaseOrderItem'''(poId, productId, quantity, unit_cost)
     415
     416- '''PK:''' (poId, productId)
     417
     418- '''FK:''' poId → !PurchaseOrder(poId) - '''идентификувачка'''
     419
     420- '''FK:''' productId → Product(productId)
     421
     422- '''Тип на ентитет:''' Слаб ентитет (зависен од !PurchaseOrder)
     423
     424- '''Нормална форма:''' BCNF
     425
     426=== Ентитет 11: WAREHOUSESTOCK (Слаб ентитет) ===
     427
     428==== Почетна релациска шема ====
     429
     430'''!WarehouseStock'''(warehouseId, productId, quantity_on_hand, last_updated)
     431
     432==== Функционални зависиности ====
     433
     434'''FD12:''' (warehouseId, productId) → quantity_on_hand, last_updated
     435
     436==== Анализа на кандидатски клучеви ====
     437
     438{warehouseId, productId}⁺ = {warehouseId, productId, quantity_on_hand, last_updated}
     439
     440'''Кандидатски клучеви:''' {(warehouseId, productId)}
     441
     442'''Примарен клуч:''' (warehouseId, productId)
     443
     444==== Финална шема ====
     445
     446'''!WarehouseStock'''(warehouseId, productId, quantity_on_hand, last_updated)
     447
     448- '''PK:''' (warehouseId, productId)
     449
     450- '''FK:''' warehouseId → Warehouse(warehouseId) - '''идентификувачка'''
     451
     452- '''FK:''' productId → Product(productId)
     453
     454- '''Тип на ентитет:''' Слаб ентитет (зависен од Warehouse)
     455
     456- '''Нормална форма:''' BCNF
     457
     458== Дел 2: Сеопфатно резиме ==
     459
     460=== Резиме на функционални зависиности ===
     461
     4621. '''User:''' userId → username, password, full_name, email, role, is_active
     463
     4642. '''Customer:''' customerId → name, email, phone, address
     465
     4663. '''Category:''' categoryId → name, description
     467
     4684. '''Supplier:''' supplierId → name, contact_person, phone, email, address
     469
     4705. '''Warehouse:''' warehouseId → name, location, capacity
     471
     4726. '''Product:'''
     473 * productId → name, description, sku, unit_price, reorder_level, categoryId, supplierId
     474 * sku → productId, name, description, unit_price, reorder_level, categoryId, supplierId
     475
     4767. '''Sale:''' saleId → date_time, total_amount, userId, customerId, warehouseId
     477
     4788. '''PurchaseOrder:''' poId → order_date, expected_delivery_date, status, supplierId, warehouseId
     479
     4809. '''SaleItem:''' (saleId, productId) → quantity, unit_price_at_sale
     481
     48210. '''PurchaseOrderItem:''' (poId, productId) → quantity, unit_cost
     483
     48411. '''WarehouseStock:''' (warehouseId, productId) → quantity_on_hand, last_updated
     485
     486=== Резиме на кандидатски клучеви ===
     487
     488'''User:'''
     489* Кандидатски клуч: {userId}
     490* Примарен клуч: userId
     491
     492'''Customer:'''
     493* Кандидатски клуч: {customerId}
     494* Примарен клуч: customerId
     495
     496'''Category:'''
     497* Кандидатски клуч: {categoryId}
     498* Примарен клуч: categoryId
     499
     500'''Supplier:'''
     501* Кандидатски клуч: {supplierId}
     502* Примарен клуч: supplierId
     503
     504'''Warehouse:'''
     505* Кандидатски клуч: {warehouseId}
     506* Примарен клуч: warehouseId
     507
     508'''Product:'''
     509* Кандидатски клучеви: {productId}, {sku}
     510* Примарен клуч: productId
     511* Алтернативен клуч: sku
     512
     513'''Sale:'''
     514* Кандидатски клуч: {saleId}
     515* Примарен клуч: saleId
     516
     517'''PurchaseOrder:'''
     518* Кандидатски клуч: {poId}
     519* Примарен клуч: poId
     520
     521'''SaleItem:'''
     522* Кандидатски клуч: {(saleId, productId)}
     523* Примарен клуч: (saleId, productId)
     524
     525'''PurchaseOrderItem:'''
     526* Кандидатски клуч: {(poId, productId)}
     527* Примарен клуч: (poId, productId)
     528
     529'''WarehouseStock:'''
     530* Кандидатски клуч: {(warehouseId, productId)}
     531* Примарен клуч: (warehouseId, productId)