I'm pretty sure a lot of applications, critical applications, banks and so on do this on a daily basis.
The idea behind all that is:
- all the rows must have a history
- all links must stay coherent
- it should be easy to make requests to get "current" columns
- clients who have bought obsolete things should still see what they've bought even though this product is not part of the catalogue anymore
and so on.
Here's what I want to do, and I'll explain the problems I'm facing.
All my tables will have those columns:
idid_origindate of creationstart date of validitystart end of validity
And here are the ideas for CRUD operations:
- create = insert new row with
id_origin=id,date of creation=now,start date of validity=now,end date of validity=null (= means it's the current active record) - update =
- read = read all the records with
end date of validity==null - update the "current" record
end date of validity=null withend date of validity=now - create a new one with the new values, and
end date of validity=null (= means it's the current active record)
- read = read all the records with
- delete = update the "current" record
end date of validity=null withend date of validity=now
So here's my problem: with many-to-many associations. Let's take an example with values:
- Table A (id = 1, id_origin = 1, start=now, end=null)
- Table A_B (start=now, end=null, id_A = 1, id_B = 48)
- Table B (id = 48, id_origin = 48, start=now, end=null)
Now I want to update table A, record id=1
- I mark record id=1 with end=now
I insert a new value into table A and... damn I've lost my relation A_B unless I duplicate the relation, too... this would end to a table:
Table A (id = 1, id_origin = 1, start=now, end=now+8mn)
- Table A (id = 2, id_origin = 1, start=now+8mn, end=null)
- Table A_B (start=now, end=null, id_A = 1, id_B = 48)
- Table A_B (start=now, end=null, id_A = 2, id_B = 48)
- Table B (id = 48, id_origin = 48, start=now, end=null)
And... well I have another problem: the relation A_B: shall I mark (id_A = 1, id_B = 48) as obsolete or not (A - id=1 is obsolete, but not B - 48)?
How to deal with this?
I have to design this on a big scale: products, partners, and so on.
What is your experience on this? How would you do (how have you done)?
-- Edit
I've found this very interesting article, but it doesn't deal properly with "cascasding obsolescence" (= what I'm asking actually)