An interesting link on normalization is:
http://www.gslis.utexas.edu/~l384k11w/normover.html
rongiul makes a good point. WHat works best in theory may not be the best for your situation.
In the example given of invoices, if you normalize but you really need to know what address the client had when the invocie was issued, then you would need an address table
Client
Client_ID Client_Name, AddressID
Address
AddressID, Address (street/city/state/country etc.), StartDate, EndDate
Invoice
InvoiceID InvoiceNo Client_ID, InvoiceDate, AddressID
Now if the client moved offices and you need to know which address a certain invoice went to thenyou follow the AddressID in the Invoice table.
Now, a purer form of normalization would be even more complex:
Address
AddressID, Address (street/city/state/country etc.), StartDate
Invoice
InvoiceID InvoiceNo Client_ID, InvoiceDate
Note there is no AddressID in the Invoice table. Instead you have to use the InvoiceDate and for that ClientID find the Address in the Address table that matches. It’s an easy compare if the Address Table has a start and end date – you want Invoice.InvoiceDate >Address.StartDate and Invoice.InvioceDate <Address.EndDate
Howwever if the Address table only has a start date then you have to compare all the addresses for that client and find the right one. (I’ll let you figure how )
I always am in favor of both a StartDate and EndDate, even if it means that when the client moves the EndDAte of the old address is one day less than the start date of the current address. There are just too many deadlines to do it the longer way, and disk space is not THAT expensive that you can’t do it the longer way.
Unfortunately in the real world many businesses do not normalize much at all -- and do not have an address table. This is a problem when you mailorder something and have to give them your home address to verify billing with your credit card and then you give them shipping address. Unfortunately I have run into several times where they let you entera separate gift/shipping address ... but whoever wrote the program that produces the labels just pulls off the billing address and does not check for a shipping address. This makes little sense from the custmerviewpoint -- if they collect the shipping address why not use it? But it happens much too often.
Mark