Я не знаю ни одного решения для всего этого - вероятно, потому что каждый проект настолько отличается. Однако вот две техники, которые я использовал в прошлом:
Внедрить концепцию версии и достоверности в вашу модель данных
Это способ справиться с изменениями во времени, не прибегая к таблицам истории; это усложняет ваши запросы, поэтому вы должны использовать его экономно.
Например, вместо таблицы продуктов следующим образом
PRODUCTS
Product_ID primary key
Price
Description
AvailableFlag
В этой модели, если вы хотите удалить продукт, вы выполняете "delete from product where product_id = ..."
; изменяющая цена будет "update products set price = 1 where product_id = ...."
С версионной моделью у вас есть:
PRODUCTS
product_ID primary key
valid_from datetime
valid_until datetime
deleted_flag
Price
Description
AvailableFlag
В этой модели для удаления товара требуется update products set valid_until = getdate() where product_id = xxx and valid_until is null
, а затем вставьте новую строку со значением «dele_flag = true».
Изменение цены работает так же.
Это означает, что вы можете выполнять запросы к «грязным» данным и вставлять их в эту таблицу, не беспокоясь об удалении элементов, которые были случайно пропущены при импорте. Это также позволяет вам видеть эволюцию записи с течением времени и легко выполнять откат.
Использовать механизм, подобный регистру, для кумулятивных значений
Если у вас есть такие вещи, как «количество товаров на складе», это помогает создавать транзакции для изменения суммы, а не брать текущую сумму из вашего фида данных.
Например, вместо столбца amount_in_stock
в вашей таблице продуктов, есть таблица "product_stock_transaction":
product_stock_transactions
product_id FK transaction_date transaction_quantity transaction_source
1 1 Jan 2012 100 product_feed
1 2 Jan 2012 -3 stock_adjust_feed
1 3 Jan 2012 10 product_feed
2 января количество на складе было 97; 3 января 107.
Этот дизайн позволяет отслеживать настройки и их источник, и им легче управлять при перемещении данных из нескольких источников.
Оба подхода могут создавать большие объемы данных - в зависимости от количества импортов и объема данных - и могут приводить к сложным запросам для извлечения относительно простых наборов данных.
Трудно заранее спланировать проблемы с производительностью - я видел, как "история" и "бухгалтерская книга" работают с большими объемами данных. Однако, как говорит Евгений в своем комментарии ниже, если вы попадете в слишком большую бухгалтерскую книгу, может потребоваться очистить таблицу бухгалтерской книги, суммируя текущие уровни и удаляя (или архивируя) старые записи.