Changes between Initial Version and Version 1 of Normalization


Ignore:
Timestamp:
07/03/26 12:48:19 (9 days ago)
Author:
223091
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v1 v1  
     1= Normalization =
     2
     3This page documents Phase P5 of the Room Reservation System project. The goal of this phase is to check the database model using formal normalization methods and to improve the model if typical problems of un-normalized designs are found.
     4
     5The normalization process starts from one theoretical de-normalized relation that contains all attributes from the model. From that relation, functional dependencies, candidate keys, and normal forms are analyzed. The relation is then decomposed step by step to the highest possible normal form while preserving functional dependencies and loss-less join properties.
     6
     7== De-normalized database form ==
     8
     9=== Initial de-normalized relation ===
     10
     11The process starts from a single unified de-normalized relation. This relation is not implemented in the database. It is used only as a formal starting point for the normalization process.
     12
     13The relation contains data about reservations, rooms, buildings, users, equipment, requested equipment, equipment assigned to rooms, and approvals. Attribute names are made globally unique in order to avoid duplicate attribute names.
     14
     15{{{
     16R0(
     17reservation_id,
     18reservation_date,
     19start_time,
     20end_time,
     21status,
     22
     23```
     24room_id,
     25room_code,
     26room_capacity,
     27room_type,
     28
     29building_id,
     30building_name,
     31building_address,
     32
     33requester_user_id,
     34requester_username,
     35requester_email,
     36requester_full_name,
     37requester_role,
     38
     39requested_equipment_id,
     40requested_equipment_name,
     41requested_equipment_stock_quantity,
     42requested_quantity,
     43
     44room_equipment_id,
     45room_equipment_name,
     46room_equipment_stock_quantity,
     47room_equipment_quantity,
     48
     49approval_id,
     50approver_user_id,
     51approver_username,
     52approver_email,
     53approver_full_name,
     54approver_role,
     55
     56decision,
     57decision_time,
     58note
     59```
     60
     61)
     62}}}
     63
     64In this theoretical relation, the attributes ''requested_equipment_id'' and ''room_equipment_id'' both refer to equipment items, but they are named differently in the de-normalized form because the same entity type appears in two different roles. During normalization, these two groups are merged into one final ''equipment'' relation.
     65
     66=== Functional dependencies ===
     67
     68The following functional dependencies are valid in the de-normalized relation. For readability, they are written in grouped form. Each grouped dependency can be split into dependencies with one attribute on the right-hand side.
     69
     70{{{
     71reservation_id -> reservation_date, start_time, end_time, status, room_id, requester_user_id
     72
     73room_id -> room_code, room_capacity, room_type, building_id
     74room_code -> room_id
     75
     76building_id -> building_name, building_address
     77building_name, building_address -> building_id
     78
     79requester_user_id -> requester_username, requester_email, requester_full_name, requester_role
     80requester_username -> requester_user_id, requester_email, requester_full_name, requester_role
     81requester_email -> requester_user_id, requester_username, requester_full_name, requester_role
     82
     83approver_user_id -> approver_username, approver_email, approver_full_name, approver_role
     84approver_username -> approver_user_id, approver_email, approver_full_name, approver_role
     85approver_email -> approver_user_id, approver_username, approver_full_name, approver_role
     86
     87requested_equipment_id -> requested_equipment_name, requested_equipment_stock_quantity
     88requested_equipment_name -> requested_equipment_id, requested_equipment_stock_quantity
     89
     90room_equipment_id -> room_equipment_name, room_equipment_stock_quantity
     91room_equipment_name -> room_equipment_id, room_equipment_stock_quantity
     92
     93reservation_id, requested_equipment_id -> requested_quantity
     94room_id, room_equipment_id -> room_equipment_quantity
     95
     96approval_id -> reservation_id, approver_user_id, decision, decision_time, note
     97reservation_id -> approval_id, approver_user_id, decision, decision_time, note
     98}}}
     99
     100The dependency ''reservation_id -> approval_id, approver_user_id, decision, decision_time, note'' is valid for reservations that already have an approval decision. A reservation may still be pending, so the approval-related values may be missing until an approval is created. The business rule is that one reservation can have at most one approval record.
     101
     102=== Candidate keys and primary key ===
     103
     104The de-normalized relation contains information about one reservation, the equipment requested in that reservation, and the equipment assigned to the selected room. Therefore, a complete row in the de-normalized relation is identified by a combination of the reservation and the two equipment-role identifiers.
     105
     106Candidate keys for the de-normalized relation include:
     107
     108{{{
     109K1 = (reservation_id, requested_equipment_id, room_equipment_id)
     110K2 = (reservation_id, requested_equipment_name, room_equipment_id)
     111K3 = (reservation_id, requested_equipment_id, room_equipment_name)
     112K4 = (reservation_id, requested_equipment_name, room_equipment_name)
     113}}}
     114
     115The selected primary key for the de-normalized relation is:
     116
     117{{{
     118(reservation_id, requested_equipment_id, room_equipment_id)
     119}}}
     120
     121This key is selected because it uses stable numeric identifiers instead of descriptive names.
     122
     123=== Normal form of the de-normalized relation ===
     124
     125The de-normalized relation is in 1NF because all attributes contain atomic values. There are no repeating groups inside one attribute, and equipment occurrences are represented as separate rows.
     126
     127However, the relation is not in 2NF because there are partial dependencies on parts of the composite key. Examples:
     128
     129{{{
     130reservation_id -> reservation_date, start_time, end_time, status, room_id, requester_user_id
     131
     132requested_equipment_id -> requested_equipment_name, requested_equipment_stock_quantity
     133
     134room_equipment_id -> room_equipment_name, room_equipment_stock_quantity
     135}}}
     136
     137These dependencies show that some non-key attributes depend only on part of the composite key, not on the whole key. Because of this, the relation is not in 2NF. Consequently, it is also not in 3NF or BCNF.
     138
     139== 1NF decomposition ==
     140
     141The first normal form requires that all attribute values are atomic and that repeating groups are removed.
     142
     143The relation R0 is already represented with atomic values. Multiple requested equipment items and multiple equipment items assigned to a room are represented as separate rows instead of being stored as lists in one attribute.
     144
     145Therefore, no additional decomposition is required for 1NF.
     146
     147The relation after this step is still:
     148
     149{{{
     150R0(
     151reservation_id,
     152reservation_date,
     153start_time,
     154end_time,
     155status,
     156room_id,
     157room_code,
     158room_capacity,
     159room_type,
     160building_id,
     161building_name,
     162building_address,
     163requester_user_id,
     164requester_username,
     165requester_email,
     166requester_full_name,
     167requester_role,
     168requested_equipment_id,
     169requested_equipment_name,
     170requested_equipment_stock_quantity,
     171requested_quantity,
     172room_equipment_id,
     173room_equipment_name,
     174room_equipment_stock_quantity,
     175room_equipment_quantity,
     176approval_id,
     177approver_user_id,
     178approver_username,
     179approver_email,
     180approver_full_name,
     181approver_role,
     182decision,
     183decision_time,
     184note
     185)
     186}}}
     187
     188The relation is in 1NF, but it is not in 2NF because of partial dependencies.
     189
     190== 2NF decomposition ==
     191
     192A relation is in 2NF if it is in 1NF and every non-prime attribute is fully functionally dependent on the whole candidate key.
     193
     194The relation R0 violates 2NF because many attributes depend only on part of the composite key. For example, reservation data depends only on ''reservation_id'', requested equipment data depends only on ''requested_equipment_id'', and room equipment data depends only on ''room_equipment_id''.
     195
     196The first decomposition removes these partial dependencies.
     197
     198=== Decomposition step ===
     199
     200The following relations are obtained:
     201
     202{{{
     203R1_reservations(
     204reservation_id,
     205reservation_date,
     206start_time,
     207end_time,
     208status,
     209room_id,
     210requester_user_id
     211)
     212}}}
     213
     214Key:
     215
     216{{{
     217reservation_id
     218}}}
     219
     220Functional dependencies preserved:
     221
     222{{{
     223reservation_id -> reservation_date, start_time, end_time, status, room_id, requester_user_id
     224}}}
     225
     226{{{
     227R1_rooms(
     228room_id,
     229room_code,
     230room_capacity,
     231room_type,
     232building_id,
     233building_name,
     234building_address
     235)
     236}}}
     237
     238Keys:
     239
     240{{{
     241room_id
     242room_code
     243}}}
     244
     245Functional dependencies preserved:
     246
     247{{{
     248room_id -> room_code, room_capacity, room_type, building_id, building_name, building_address
     249room_code -> room_id
     250}}}
     251
     252{{{
     253R1_requester_users(
     254requester_user_id,
     255requester_username,
     256requester_email,
     257requester_full_name,
     258requester_role
     259)
     260}}}
     261
     262Keys:
     263
     264{{{
     265requester_user_id
     266requester_username
     267requester_email
     268}}}
     269
     270Functional dependencies preserved:
     271
     272{{{
     273requester_user_id -> requester_username, requester_email, requester_full_name, requester_role
     274requester_username -> requester_user_id, requester_email, requester_full_name, requester_role
     275requester_email -> requester_user_id, requester_username, requester_full_name, requester_role
     276}}}
     277
     278{{{
     279R1_approver_users(
     280approver_user_id,
     281approver_username,
     282approver_email,
     283approver_full_name,
     284approver_role
     285)
     286}}}
     287
     288Keys:
     289
     290{{{
     291approver_user_id
     292approver_username
     293approver_email
     294}}}
     295
     296Functional dependencies preserved:
     297
     298{{{
     299approver_user_id -> approver_username, approver_email, approver_full_name, approver_role
     300approver_username -> approver_user_id, approver_email, approver_full_name, approver_role
     301approver_email -> approver_user_id, approver_username, approver_full_name, approver_role
     302}}}
     303
     304{{{
     305R1_requested_equipment(
     306requested_equipment_id,
     307requested_equipment_name,
     308requested_equipment_stock_quantity
     309)
     310}}}
     311
     312Keys:
     313
     314{{{
     315requested_equipment_id
     316requested_equipment_name
     317}}}
     318
     319Functional dependencies preserved:
     320
     321{{{
     322requested_equipment_id -> requested_equipment_name, requested_equipment_stock_quantity
     323requested_equipment_name -> requested_equipment_id, requested_equipment_stock_quantity
     324}}}
     325
     326{{{
     327R1_room_equipment_item(
     328room_equipment_id,
     329room_equipment_name,
     330room_equipment_stock_quantity
     331)
     332}}}
     333
     334Keys:
     335
     336{{{
     337room_equipment_id
     338room_equipment_name
     339}}}
     340
     341Functional dependencies preserved:
     342
     343{{{
     344room_equipment_id -> room_equipment_name, room_equipment_stock_quantity
     345room_equipment_name -> room_equipment_id, room_equipment_stock_quantity
     346}}}
     347
     348{{{
     349R1_reservation_equipment(
     350reservation_id,
     351requested_equipment_id,
     352requested_quantity
     353)
     354}}}
     355
     356Key:
     357
     358{{{
     359(reservation_id, requested_equipment_id)
     360}}}
     361
     362Functional dependency preserved:
     363
     364{{{
     365reservation_id, requested_equipment_id -> requested_quantity
     366}}}
     367
     368{{{
     369R1_room_equipment(
     370room_id,
     371room_equipment_id,
     372room_equipment_quantity
     373)
     374}}}
     375
     376Key:
     377
     378{{{
     379(room_id, room_equipment_id)
     380}}}
     381
     382Functional dependency preserved:
     383
     384{{{
     385room_id, room_equipment_id -> room_equipment_quantity
     386}}}
     387
     388{{{
     389R1_approvals(
     390approval_id,
     391reservation_id,
     392approver_user_id,
     393decision,
     394decision_time,
     395note
     396)
     397}}}
     398
     399Keys:
     400
     401{{{
     402approval_id
     403reservation_id
     404}}}
     405
     406Functional dependencies preserved:
     407
     408{{{
     409approval_id -> reservation_id, approver_user_id, decision, decision_time, note
     410reservation_id -> approval_id, approver_user_id, decision, decision_time, note
     411}}}
     412
     413=== Loss-less join and dependency preservation ===
     414
     415The decomposition to 2NF is loss-less because every decomposition step uses a determinant that is a key in one of the resulting relations. For example, reservation details are separated using ''reservation_id'', room details are separated using ''room_id'', and equipment details are separated using equipment identifiers.
     416
     417The functional dependencies are preserved because every dependency from the original relation is represented in one of the decomposed relations.
     418
     419After this step, the relations are in 2NF. However, some relations are still not in 3NF because transitive dependencies still exist.
     420
     421== 3NF decomposition ==
     422
     423A relation is in 3NF if it is in 2NF and no non-prime attribute depends transitively on a candidate key.
     424
     425The relation ''R1_rooms'' still contains a transitive dependency:
     426
     427{{{
     428room_id -> building_id
     429building_id -> building_name, building_address
     430}}}
     431
     432Therefore:
     433
     434{{{
     435room_id -> building_name, building_address
     436}}}
     437
     438This means that building data depends on ''room_id'' only through ''building_id''. To remove this transitive dependency, building data is decomposed into a separate relation.
     439
     440=== Decomposition of room and building data ===
     441
     442The relation:
     443
     444{{{
     445R1_rooms(
     446room_id,
     447room_code,
     448room_capacity,
     449room_type,
     450building_id,
     451building_name,
     452building_address
     453)
     454}}}
     455
     456is decomposed into:
     457
     458{{{
     459buildings(
     460building_id,
     461name,
     462address
     463)
     464}}}
     465
     466Keys:
     467
     468{{{
     469building_id
     470(name, address)
     471}}}
     472
     473Functional dependencies:
     474
     475{{{
     476building_id -> name, address
     477name, address -> building_id
     478}}}
     479
     480{{{
     481rooms(
     482room_id,
     483building_id,
     484room_code,
     485capacity,
     486type
     487)
     488}}}
     489
     490Keys:
     491
     492{{{
     493room_id
     494room_code
     495}}}
     496
     497Functional dependencies:
     498
     499{{{
     500room_id -> building_id, room_code, capacity, type
     501room_code -> room_id
     502}}}
     503
     504This removes the transitive dependency between rooms and building attributes.
     505
     506=== Merging user roles ===
     507
     508The 2NF decomposition produced separate requester and approver user relations because the same entity type appeared in different roles in the de-normalized relation.
     509
     510However, both groups represent the same real entity set: users of the system. Therefore, they are merged into one relation:
     511
     512{{{
     513users(
     514user_id,
     515username,
     516email,
     517full_name,
     518role
     519)
     520}}}
     521
     522Keys:
     523
     524{{{
     525user_id
     526username
     527email
     528}}}
     529
     530Functional dependencies:
     531
     532{{{
     533user_id -> username, email, full_name, role
     534username -> user_id, email, full_name, role
     535email -> user_id, username, full_name, role
     536}}}
     537
     538In the final schema, ''reservations.user_id'' references the requester, while ''approvals.approver_id'' references the user who made the approval decision.
     539
     540=== Merging equipment roles ===
     541
     542The 2NF decomposition produced separate requested-equipment and room-equipment item relations because equipment appeared in two different roles in the de-normalized relation.
     543
     544However, both groups represent the same entity set: equipment types. Therefore, they are merged into one relation:
     545
     546{{{
     547equipment(
     548equipment_id,
     549name,
     550stock_quantity
     551)
     552}}}
     553
     554Keys:
     555
     556{{{
     557equipment_id
     558name
     559}}}
     560
     561Functional dependencies:
     562
     563{{{
     564equipment_id -> name, stock_quantity
     565name -> equipment_id, stock_quantity
     566}}}
     567
     568The relation ''room_equipment'' represents equipment assigned to rooms, while ''reservation_equipment'' represents equipment requested as part of reservations.
     569
     570=== Final relations after 3NF decomposition ===
     571
     572After removing partial and transitive dependencies, the resulting relations are:
     573
     574{{{
     575buildings(
     576building_id,
     577name,
     578address
     579)
     580}}}
     581
     582{{{
     583rooms(
     584room_id,
     585building_id,
     586room_code,
     587capacity,
     588type
     589)
     590}}}
     591
     592{{{
     593equipment(
     594equipment_id,
     595name,
     596stock_quantity
     597)
     598}}}
     599
     600{{{
     601room_equipment(
     602room_id,
     603equipment_id,
     604quantity
     605)
     606}}}
     607
     608{{{
     609users(
     610user_id,
     611username,
     612email,
     613full_name,
     614role
     615)
     616}}}
     617
     618{{{
     619reservations(
     620reservation_id,
     621room_id,
     622user_id,
     623reservation_date,
     624start_time,
     625end_time,
     626status
     627)
     628}}}
     629
     630{{{
     631reservation_equipment(
     632reservation_id,
     633equipment_id,
     634requested_quantity
     635)
     636}}}
     637
     638{{{
     639approvals(
     640approval_id,
     641reservation_id,
     642approver_id,
     643decision,
     644decision_time,
     645note
     646)
     647}}}
     648
     649=== Loss-less join and dependency preservation ===
     650
     651The 3NF decomposition is loss-less because each decomposition separates attributes based on a functional dependency where the determinant becomes a key in one of the resulting relations.
     652
     653Examples:
     654
     655{{{
     656building_id -> name, address
     657}}}
     658
     659is preserved in:
     660
     661{{{
     662buildings(building_id, name, address)
     663}}}
     664
     665and the relation can be joined back with:
     666
     667{{{
     668rooms(room_id, building_id, room_code, capacity, type)
     669}}}
     670
     671using the foreign key ''building_id''.
     672
     673Similarly, user data and equipment data are separated into their own relations and referenced by identifiers from reservations, approvals, room equipment, and reservation equipment.
     674
     675The decomposition preserves the functional dependencies because each important dependency is represented inside one of the final relations.
     676
     677== BCNF if possible ==
     678
     679A relation is in BCNF if for every non-trivial functional dependency X -> Y, X is a superkey.
     680
     681The final relations are checked for BCNF as follows.
     682
     683=== buildings ===
     684
     685Relation:
     686
     687{{{
     688buildings(building_id, name, address)
     689}}}
     690
     691Functional dependencies:
     692
     693{{{
     694building_id -> name, address
     695name, address -> building_id
     696}}}
     697
     698Candidate keys:
     699
     700{{{
     701building_id
     702(name, address)
     703}}}
     704
     705All determinants are candidate keys, so the relation is in BCNF.
     706
     707=== rooms ===
     708
     709Relation:
     710
     711{{{
     712rooms(room_id, building_id, room_code, capacity, type)
     713}}}
     714
     715Functional dependencies:
     716
     717{{{
     718room_id -> building_id, room_code, capacity, type
     719room_code -> room_id
     720}}}
     721
     722Candidate keys:
     723
     724{{{
     725room_id
     726room_code
     727}}}
     728
     729All determinants are candidate keys, so the relation is in BCNF.
     730
     731=== equipment ===
     732
     733Relation:
     734
     735{{{
     736equipment(equipment_id, name, stock_quantity)
     737}}}
     738
     739Functional dependencies:
     740
     741{{{
     742equipment_id -> name, stock_quantity
     743name -> equipment_id, stock_quantity
     744}}}
     745
     746Candidate keys:
     747
     748{{{
     749equipment_id
     750name
     751}}}
     752
     753All determinants are candidate keys, so the relation is in BCNF.
     754
     755=== room_equipment ===
     756
     757Relation:
     758
     759{{{
     760room_equipment(room_id, equipment_id, quantity)
     761}}}
     762
     763Functional dependency:
     764
     765{{{
     766room_id, equipment_id -> quantity
     767}}}
     768
     769Candidate key:
     770
     771{{{
     772(room_id, equipment_id)
     773}}}
     774
     775The determinant is the candidate key, so the relation is in BCNF.
     776
     777=== users ===
     778
     779Relation:
     780
     781{{{
     782users(user_id, username, email, full_name, role)
     783}}}
     784
     785Functional dependencies:
     786
     787{{{
     788user_id -> username, email, full_name, role
     789username -> user_id, email, full_name, role
     790email -> user_id, username, full_name, role
     791}}}
     792
     793Candidate keys:
     794
     795{{{
     796user_id
     797username
     798email
     799}}}
     800
     801All determinants are candidate keys, so the relation is in BCNF.
     802
     803=== reservations ===
     804
     805Relation:
     806
     807{{{
     808reservations(reservation_id, room_id, user_id, reservation_date, start_time, end_time, status)
     809}}}
     810
     811Functional dependencies:
     812
     813{{{
     814reservation_id -> room_id, user_id, reservation_date, start_time, end_time, status
     815room_id, reservation_date, start_time, end_time -> reservation_id
     816}}}
     817
     818Candidate keys:
     819
     820{{{
     821reservation_id
     822(room_id, reservation_date, start_time, end_time) for room-based reservations
     823}}}
     824
     825The determinant ''reservation_id'' is the primary key. The determinant ''(room_id, reservation_date, start_time, end_time)'' is an alternative key for room-based reservations. Therefore, the relation is in BCNF.
     826
     827The attribute ''room_id'' is optional because equipment-only reservations are allowed.
     828
     829=== reservation_equipment ===
     830
     831Relation:
     832
     833{{{
     834reservation_equipment(reservation_id, equipment_id, requested_quantity)
     835}}}
     836
     837Functional dependency:
     838
     839{{{
     840reservation_id, equipment_id -> requested_quantity
     841}}}
     842
     843Candidate key:
     844
     845{{{
     846(reservation_id, equipment_id)
     847}}}
     848
     849The determinant is the candidate key, so the relation is in BCNF.
     850
     851=== approvals ===
     852
     853Relation:
     854
     855{{{
     856approvals(approval_id, reservation_id, approver_id, decision, decision_time, note)
     857}}}
     858
     859Functional dependencies:
     860
     861{{{
     862approval_id -> reservation_id, approver_id, decision, decision_time, note
     863reservation_id -> approval_id, approver_id, decision, decision_time, note
     864}}}
     865
     866Candidate keys:
     867
     868{{{
     869approval_id
     870reservation_id
     871}}}
     872
     873All determinants are candidate keys, so the relation is in BCNF.
     874
     875=== BCNF conclusion ===
     876
     877All final relations are in BCNF. The decomposition also preserves the important functional dependencies and has loss-less join properties. Therefore, no further decomposition is required.
     878
     879== Final result and discussion ==
     880
     881=== Normalized relational model ===
     882
     883The final normalized relational model is:
     884
     885{{{
     886buildings(
     887building_id PK,
     888name,
     889address
     890)
     891}}}
     892
     893{{{
     894rooms(
     895room_id PK,
     896building_id FK,
     897room_code AK,
     898capacity,
     899type
     900)
     901}}}
     902
     903{{{
     904equipment(
     905equipment_id PK,
     906name AK,
     907stock_quantity
     908)
     909}}}
     910
     911{{{
     912room_equipment(
     913room_id PK, FK,
     914equipment_id PK, FK,
     915quantity
     916)
     917}}}
     918
     919{{{
     920users(
     921user_id PK,
     922username AK,
     923email AK,
     924full_name,
     925role
     926)
     927}}}
     928
     929{{{
     930reservations(
     931reservation_id PK,
     932room_id FK,
     933user_id FK,
     934reservation_date,
     935start_time,
     936end_time,
     937status
     938)
     939}}}
     940
     941{{{
     942reservation_equipment(
     943reservation_id PK, FK,
     944equipment_id PK, FK,
     945requested_quantity
     946)
     947}}}
     948
     949{{{
     950approvals(
     951approval_id PK,
     952reservation_id FK, AK,
     953approver_id FK,
     954decision,
     955decision_time,
     956note
     957)
     958}}}
     959
     960=== Discussion ===
     961
     962The normalization process started from a single de-normalized relation containing all attributes from the model. That relation was in 1NF, but it was not in 2NF because many attributes depended only on parts of the composite key. The decomposition removed partial dependencies, then removed transitive dependencies, and finally checked the resulting relations for BCNF.
     963
     964The final normalized design contains separate relations for buildings, rooms, equipment, users, reservations, room equipment, reservation equipment, and approvals.
     965
     966The M:N relationship between rooms and equipment is represented by:
     967
     968{{{
     969room_equipment(room_id, equipment_id, quantity)
     970}}}
     971
     972The M:N relationship between reservations and requested equipment is represented by:
     973
     974{{{
     975reservation_equipment(reservation_id, equipment_id, requested_quantity)
     976}}}
     977
     978This prevents repeated data and allows equipment to be managed independently from both rooms and reservations.
     979
     980=== Comparison with Phase P2 ===
     981
     982The final normalized model obtained in this phase is consistent with the relational design from Phase P2. The same main relations are used:
     983
     984* buildings
     985* rooms
     986* equipment
     987* room_equipment
     988* users
     989* reservations
     990* reservation_equipment
     991* approvals
     992
     993This means that the Phase P2 relational schema was already designed in a normalized way. No structural change to the existing PostgreSQL database schema is required after the normalization check.
     994
     995The existing Phase P2 design will continue to be used in the following project phases.
     996
     997== Conclusion ==
     998
     999The formal normalization process shows that the final relational model is in BCNF. The decomposition preserves the functional dependencies, has loss-less join properties, and matches the already implemented relational schema from Phase P2.
     1000
     1001Therefore, the current database design is appropriate for the next phases of the project.