Database Normalization: First, Second, and Third Normal Forms
I read a great explanation of first, second, and third normal form a few weeks ago. For those that know what database normalization is but haven't seen the "forms", the different forms are essentially rules for having a well normalized relation DB. Keeping them in mind when doing DB design is key to keeping a great database. I'd like to make an attempt at condensing the linked tutorial into its essentials.
First Normal Form (1NF): No repeating elements or groups of elementsDon't repeat your columns. Avoid this:
Second Normal Form (2NF): No partial dependencies on a concatenated keyThis is a complex way of saying that if a column isn’t intrinsically related to the entire primary key, then you should break out the primary key into different tables.
|OrderId (PK)||ItemId (PK)||OrderDate||…|
Consider OrderDate. It is conceptually part of an order. An order always occurs at some time. But is an OrderDate related to an Item? Not really.
You may be saying, “but items are part of an order!”, and you would be right. But that’s not what I’m getting at. OrderDate is independent of the item itself.
Look at another way: in the table above the OrderDate will always be the same for a given OrderId regardless of the value of the ItemId column. This means data duplication, which is denormalization.
Here’s how we correct the problem:
|OrderId (PK)||ItemId (PK)||…|
Third Normal Form (3NF): No dependencies on non-key attributes2NF covers the case of multi-column primary keys. 3NF is meant to cover single column keys. Simply stated, pull out columns that don’t directly relate to the subject of the row (the primary key), and put them in their own table.
Wikipedia has a great quote from Bill Kent: “every non-key attribute ‘must provide a fact about the key, the whole key, and nothing but the key’.”