The problem statement is very easy:
- Online store (everybody knows what is it about)
- Each user has Address.
- You can place Order for one Product.
- To simplify you have only 3 tables: Order, Product, Address.
But then when Product or Address is updated it would affect Order that was placed. Of course this behaviour would be unacceptable from business perspective. If you would like to keep this design you could make Address and Product rows immunable. So every time user changes address new row is added to Address table and every product modification is a new row Product table. This could work in this scenario but:
- There is a risk that database would grow.(not a big deal)
- How would you solve that some other tables are related to Product or Address. With every Product, Address change you should write logic to replace foreign keys with new values.
- Change of object should be update in database. That's what I feel :).
That is why, I would choose alternative approach.
It looks like denormalized and as wikipedia states:
A standard piece of database design guidance is that the designer should create a fully normalized designbut in my opinion it isn't denormalized. When order is placed you have to take a snapshot of related tables Product and Address. Since the relations Order-Product and Order-Address is 1-1 you can just add fields to Order.
What are your opinions? How can you design it better?

