Я уверен, что многие приложения, критические приложения, банки и так далее делают это ежедневно.
Идея, стоящая за всем этим:
- все строки должны иметь историю
- все ссылки должны оставаться связными
- должно быть легко делать запросы, чтобы получить «текущие» столбцы
- клиенты, которые купили устаревшие вещи, все равно должны видеть то, что они купили, хотя этот продукт больше не является частью каталога
и так далее.
Вот что я хочу сделать, и я объясню проблемы, с которыми я сталкиваюсь.
Все мои таблицы будут иметь эти столбцы:
id
id_origin
date of creation
start date of validity
start end of validity
И вот идеи для операций CRUD:
- создать = вставить новую строку с
id_origin
=id
,date of creation
= сейчас,start date of validity
= сейчас,end date of validity
= ноль (= означает, что это текущая активная запись) - обновление =
- читать = читать все записи с
end date of validity
== ноль - обновить "текущую" запись
end date of validity
= null сend date of validity
= сейчас - создайте новый с новыми значениями, и
end date of validity
= null (= означает, что это текущая активная запись)
- читать = читать все записи с
- delete = обновить "текущую" запись
end date of validity
= null сend date of validity
= сейчас
Итак, вот моя проблема: со многими ко многим ассоциациям. Давайте рассмотрим пример со значениями:
- Таблица A (id = 1, id_origin = 1, начало = сейчас, конец = ноль)
- Таблица A_B (начало = сейчас, конец = ноль, id_A = 1, id_B = 48)
- Таблица B (id = 48, id_origin = 48, начало = сейчас, конец = ноль)
Теперь я хочу обновить таблицу A, id записи = 1
- Я отмечаю запись id = 1 с конца = сейчас
Я вставляю новое значение в таблицу A и ... черт, я потерял свое отношение A_B, если я тоже не дублирую отношение ... это закончится таблицей:
Таблица A (id = 1, id_origin = 1, начало = сейчас, конец = сейчас + 8мн)
- Таблица A (id = 2, id_origin = 1, начало = сейчас + 8 мин, конец = ноль)
- Таблица A_B (начало = сейчас, конец = ноль, id_A = 1, id_B = 48)
- Таблица A_B (начало = сейчас, конец = ноль, id_A = 2, id_B = 48)
- Таблица B (id = 48, id_origin = 48, начало = сейчас, конец = ноль)
И ... ну, у меня есть еще одна проблема: отношение A_B: я должен пометить (id_A = 1, id_B = 48) как устаревшее или нет (A - id = 1 устарело, но не B - 48)?
Как с этим бороться?
Я должен разработать это в больших масштабах: продукты, партнеры и так далее.
Каков ваш опыт в этом? Как бы вы сделали (как вы сделали)?
-- Редактировать
Я нашел эту очень интересную статью , но она не имеет дело с "каскадным устареванием" (= то, что я спрашиваю на самом деле)