Я впевнений, що багато додатків, критичних програм, банків і так далі роблять це щодня.
Ідея, що стоїть за цим:
- усі рядки повинні мати історію
- всі посилання повинні залишатися узгодженими
- повинно бути легко робити запити, щоб отримати "поточні" стовпці
- клієнти, які придбали застарілі речі, все одно повинні побачити, що вони купили, хоча цей товар вже не є частиною каталогу
і так далі.
Ось, що я хочу зробити, і я поясню проблеми, з якими стикаюся.
Усі мої таблиці матимуть ці стовпці:
id
id_origin
date of creation
start date of validity
start end of validity
Ось ідеї для операцій CRUD:
- create = вставити новий рядок з
id_origin
=id
,date of creation
= зараз,start date of validity
= зараз,end date of validity
= null (= означає, що це поточний активний запис) - update =
- read = читати всі записи з
end date of validity
== null - оновіть "поточний" запис
end date of validity
= null зend date of validity
= зараз - створити новий з новими значеннями, і
end date of validity
= null (= означає, що це поточний активний запис)
- read = читати всі записи з
- delete = оновити "поточний" запис
end date of validity
= null зend date of validity
= зараз
Тож ось моя проблема: з багатьма-багатьма асоціаціями. Візьмемо приклад зі значеннями:
- Таблиця A (id = 1, id_origin = 1, start = now, end = null)
- Таблиця A_B (start = now, end = null, id_A = 1, id_B = 48)
- Таблиця B (id = 48, id_origin = 48, start = now, end = null)
Тепер я хочу оновити таблицю A, запис id = 1
- Я відмічаю запис id = 1 з end = now
Я вставляю нове значення в таблицю A і ... чорт я втратив своє відношення A_B, якщо теж не дублюю відношення ... це закінчиться таблицею:
Таблиця A (id = 1, id_origin = 1, start = now, end = now + 8mn)
- Таблиця A (id = 2, id_origin = 1, start = now + 8mn, end = null)
- Таблиця A_B (start = now, end = null, id_A = 1, id_B = 48)
- Таблиця A_B (start = now, end = null, id_A = 2, id_B = 48)
- Таблиця B (id = 48, id_origin = 48, start = now, end = null)
І ... ну, у мене є ще одна проблема: відношення A_B: повинен я позначити (id_A = 1, id_B = 48) як застарілий чи ні (A - id = 1 застарілий, але не B - 48)?
Як з цим боротися?
Я мушу розробити це у великих масштабах: продукти, партнери тощо.
Який ваш досвід щодо цього? Як би ви зробили (як це зробили)?
- Редагувати
Я знайшов цю дуже цікаву статтю , але вона не належним чином стосується "каскадної застарілості" (= те, що я прошу насправді)