10. 3NF Examples
Reminder, 3NF means:
- It is already in 2NF
- There are no non-key attributes that depend on another non-key attribute
Example 1
CUSTOMER
CustomerID | Firstname | Surname | City | PostCode |
12123 | Harry | Enfield | London | SW7 2AP |
12443 | Leona | Lewis | London | WC2H 7JY |
354 | Sarah | Brightman | Coventry | CV4 7AL |
This is not in strict 3NF as the City could be obtained from the Post code attribute. If you created a table containing postcodes then city could be derived.
CustomerID | Firstname | Surname | PostCode* |
12123 | Harry | Enfield | SW7 2AP |
12443 | Leona | Lewis | WC2H 7JY |
354 | Sarah | Brightman | CV4 7AL |
POSTCODES
PostCode | City |
SW7 2AP | London |
WC2H 7JY | London |
CV4 7AL | Coventry |
Example 2.
VideoID | Title | Certificate | Description |
12123 | Saw IV | 18 | Eighteen and over |
12443 | Igor | PG | Parental Guidance |
354 | Bambi | U | Universal Classification |
The Description of what the certificate means could be obtained frome the certifcate attribute - it does not need to refer to the primary key VideoID. So split it out and use the primary key / secondary key approach.
Example 3
CLIENT
ClientID | CinemaID* | CinemaAddress |
12123 | LON23 | 1 Leicester Square. London |
12443 | COV2 | 34 Bramby St, Coventry |
354 | MAN4 | 56 Croydon Rd, Manchester |
CINEMAS
CinemaID | CinemaAddress |
LON23 | 1 Leicester Square. London |
COV2 | 34 Bramby St, Coventry |
MAN4 | 56 Croydon Rd, Manchester |
In this case the database is almost in 3NF - for some reason the Cinema Address is being repeated in the Client table, even though it can be obtained from the Cinemas table. So simply remove the column from the client table
Example 4
ORDER
OrderID | Quantity | Price | Cost |
12123 | 2 | 10.00 | 20.00 |
12443 | 3 | 20.00 | 60.00 |
354 | 4 | 30.00 | 120.00 |
In this case the cost of any order can be obtained by multiplying quantity by price. This is a 'calculated field'. The database is larger than it needs to be as a query could work out the cost of any order. So to be in strict 3NF you would remove the Cost column.