Changes between Version 8 and Version 9 of Normalization


Ignore:
Timestamp:
09/23/25 02:55:02 (2 days ago)
Author:
215010
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v8 v9  
    7979==== 1 НФ
    8080
    81 За да постигнеме 1NF, мора да се осигураме дека сите атрибути во секоја торка се атомски, што значи дека не постојат повеќевредносни атрибути или композитни атрибути.
     81Услов за 1NF: вредности на атомски атрибути (без низи / вгнездени релации).
    8282
    83 ===== Проблем во тековната шема:
     83Нема повторувачки групи или низи, значи R е во 1NF.
    8484
    85 Композитни атрибути како address (кои може да имаат повеќе компоненти како што се улица, град итн.).
     852NF (отстранување на делумни зависности)
    8686
    87 ===== Решение:
     872NF тест: ако релацијата има композитен кандидатски клуч, секој не-примарен атрибут мора да зависи од целиот клуч, а не од дел.
    8888
    89 Разделување на повеќевредносните атрибути во посебни колони.
     89Бидејќи започнавме од голем композитен суперклуч K, многу FD како user_id -> first_name се делумни зависности во однос на тој суперклуч. Стандардниот пристап е да се извлечат детерминантите и нивните зависни во нивните сопствени релации. Овој чекор обично ги дава табелите со природни ентитети.
    9090
    91 ===== Применето 1NF:
     91Декомпозиции (за отстранување на делумни зависности):
    9292
    93 Адресата во Hotel_Building треба да се подели на атомски компоненти: улица, град и поштенски код.
     93Ги извлекуваме детерминантите и нивните зависни во посебни релации:
    9494
    95 Табела Hotel_Building:
     95==== Users
    9696
    97 building_id, street, city, zip_code, floors, num_rooms
     97R1: Users(user_id, first_name, last_name, phone, email, password)
    9898
    99 Сите атрибути во секоја табела ќе бидат атомски, што значи дека нема да постојат дополнителни сложени или повеќевредносни атрибути.
     99FDs во R1: user_id -> first_name, last_name, phone, email, password
    100100
    101 ==== 2 НФ
     101PK: user_id
    102102
    103 За да постигнеме 2NF, треба да отстраниме делумни зависности. Атрибутот што не е примарен мора да биде целосно функционално зависен од целиот примарен клуч, а не само од негов дел.
     103R1 е во BCNF.
    104104
    105 ===== Проблем во тековната шема:
     105==== Hotel_Building
    106106
    107 Во Reservation, атрибутите како user_id, manager_id и room_number се делумно зависни само од дел од примарниот клуч (т.е. reservation_id), а не од целиот примарен клуч.
     107R2: Hotel_Building(building_id, address, city, floors, num_rooms, manager_id)
    108108
    109 ===== Решение:
     109FDs во R2: building_id -> address, city, floors, num_rooms, manager_id
    110110
    111 Преместување на атрибутите што зависат од дел од примарниот клуч во посебни табели за да ги елиминирате делумните зависности.
     111PK: building_id
    112112
    113 ===== Применето 2NF:
     113R2 е во BCNF.
    114114
    115 Креирање табела Customer со user_id како примарен клуч и атрибути поврзани со клиентот.
     115==== Room
    116116
    117 Креирање табела Manager со user_id како примарен клуч и атрибути поврзани со менаџерот.
     117R3: Room(room_number, building_id, room_type, number_of_beds, price_per_night, available)
    118118
    119 Изменување на Reservation за да ги чува само атрибутите што зависат од reservation_id и преместување на user_id (клиент) и manager_id во нивните соодветни табели.
     119PK: (room_number, building_id)
    120120
    121 По 2NF:
     121FDs: (room_number, building_id) -> room_type, number_of_beds, price_per_night, available
    122122
    123 Customer: user_id, first_name, last_name, phone, email, password
     123R3 е во BCNF.
    124124
    125 Manager: user_id, first_name, last_name, phone, email, password
     125==== Staff
    126126
    127 Reservation: reservation_id, start_date, end_date, reserv_date, status, room_number, building_id, customer_id, manager_id
     127R4: Staff(user_id /*staff_id*/, building_id)
    128128
    129 ==== 3 НФ
     129FDs: staff_id -> building_id
    130130
    131 За да постигнеме 3NF, мора да ги отстраниме транзитивните зависности. Непримарниот атрибут не смее да зависи од друг непримарен атрибут.
     131PK: user_id (staff_id)
    132132
    133 ===== Проблеми во тековната шема:
     133R4 е во BCNF.
    134134
    135 Во Payment, user_id индиректно одредува атрибути како first_name и last_name, создавајќи транзитивна зависност.
     135==== Reservation
    136136
    137 ===== Решение:
     137R5: Reservation(reservation_id, start_date, end_date, reserv_date, status, room_number, building_id, customer_id, manager_id)
    138138
    139 Отстранување на транзитивните зависности со креирање посебни табели за User (веќе направено во 2NF) и осигурувајќи се дека секоја табела ги складира само атрибутите што директно зависат од примарниот клуч.
     139FDs: reservation_id -> start_date, end_date, reserv_date, status, room_number, building_id, customer_id, manager_id
    140140
    141 ===== Применето 3NF:
     141PK: reservation_id
    142142
    143 Во табелата Payment, складираме само p_id, p_method, amount, p_date и reservation_id. До user_id може да се пристапи преку reservation_id, па затоа не треба да се чува во табелата Payment.
     143R5 е во BCNF.
    144144
    145 ===== По 3NF:
     145==== Service
    146146
    147 Payment: p_id, p_method, amount, p_date, reservation_id
     147R6: Service(service_id, service_type, service_date, service_status, room_number, building_id, staff_id)
    148148
    149 ==== BCNF
     149FDs: service_id -> service_type, service_date, service_status, room_number, building_id, staff_id
    150150
    151 За да се постигне BCNF, мора да се осигураме дека секоја детерминанта во релацијата е клуч-кандидат, односно За секоја функционална зависност: A→B, A мора да биде клуч-кандидат.
     151PK: service_id
    152152
    153 ===== Проблем во тековната шема:
     153R6 е во BCNF.
    154154
    155 Во табелата Service, функционалната зависност:
     155===== Payment
    156156
    157 service_id → service_type, service_date, service_status, staff_id, room_number, building_id
     157R7: Payment(reservation_id PK, p_id UNIQUE, p_method, amount, p_date, customer_id)
    158158
    159 Оваа функционална зависност покажува дека service_id ги одредува service_type, service_date и service_status, но room_number и building_id не се дел од клучот-кандидат. Така, room_number и building_id се не-примарни атрибути кои зависат од service_id, создавајќи потенцијално прекршување на BCNF.
     159FD: reservation_id -> p_id, p_method, amount, p_date, customer_id (1:1 means reservation determines payment)
    160160
    161 ===== Решение за BCNF:
     161PK: reservation_id
    162162
    163 
    164 За да го решиме ова прекршување, треба да се осигураме дека секоја детерминанта е клуч-кандидат.
    165 
    166 room_number и building_id се одредени од композитниот клуч (room_number, building_id) во табелата Room, што е клуч-кандидат.
    167 
    168 Треба да ја отстраниме зависноста од room_number и building_id од табелата Service бидејќи овие атрибути се веќе одредени од табелата Room.
    169 
    170 ===== По примена на BCNF:
    171 
    172 Табелата Service ќе ги чува само:
    173 
    174 service_id, service_type, service_date, service_status и staff_id.
    175 
    176 Табелата Room ќе продолжи да ги чува деталите поврзани со собата, вклучувајќи го room_number и building_id.
    177 
    178 Со ова, сите не-примарни атрибути во табелата Service зависат единствено од клучот-кандидат service_id.
    179 
    180 ===== Конечни табели во BCNF:
    181 
    182 По примената на BCNF и решавањето на сите проблеми, конечната шема за засегнатите табели изгледа вака:
    183 
    184 Hotel_Bidling: building_id, street, city, zip_code, floors, num_rooms
    185 
    186 Room: room_number, building_id, room_type, number_of_beds, price_per_night, available
    187 
    188 Customer: user_id, first_name, last_name, phone, e-mail, password
    189 
    190 Manager: user_id, first_name, last_name, phone, e-mail, password
    191 
    192 Reservation: reservation_id, start_date, end_date, reserv_date, status, customer_id, manager_id, room_number, building_id
    193 
    194 Payment: p_id, p_method, amount, p_date, reservation_id
    195 
    196 Service: service_id, service_type, service_date, service_status, staff_id
     163R7 е во BCNF.