Проблема, с которой вы столкнулись, является, как я уверен, вы знаете, результатом нормализации базы данных. Один из подходов к решению этого вопроса можно взять из методов бизнес-аналитики - архивирование данных в ненормированном состоянии в Data Warehouse.
Нормированная данные:
- Заказы таблица
- Клиенты Таблица
- CustomerId
- Firstname
- т.д.
- Предметы Стол
- ItemId
- ITEMNAME
- ItemPrice
- OrderDetails Таблица
- ItemDetailId
- OrderId
- ItemId
- ItemQty
- т.д.
При запросе и хранится де нормализованы, хранилище данных таблица выглядит
- OrderId
- CUSTOMERID
- CUSTOMERNAME
- CustomerAddress
- (другого клиента Поля)
- ItemDetailId
- ItemId
- ITEMNAME
- ItemPrice
- (Другие OrderDetail и пункт Fields)
Как правило, это либо какая-то запланированного задания, которое вытаскивает данные из нормализованных данных в хранилище данных по расписанию, ИЛИ, если ваш de знак позволяет, это можно сделать, когда заказ достигнет определенного статуса. (Например, отправлено). Возможно, записи сохраняются при каждом изменении статуса (с полем OrderStatus, который ссылается на текущий статус), поэтому полностью де-нормированные данные доступны для каждого этапа процесса опечатки/выполнения. Когда и как архивировать данные на склад будет отличаться в зависимости от ваших потребностей.
Существует много накладные расходы, связанные с выше, но другой общий подход, который я отдаю себе отчет несет даже больше накладных расходов.
Другим подходом было бы сделать таблицы доступными только для чтения.Если клиент хочет изменить свой адрес, вы не редактируете свой существующий адрес, вы вставляете новую запись.
Так что если мой адрес AddressId 12, когда я первый заказ на вашем сайте в Jamnuary, то я переезжаю 4 июля, я получаю новый AddressId, привязанный к моей учетной записи. (Скажите AddressId 123123, потому что ваш сайт очень успешный и привлек тонну клиентов.)
Приказы, которые я скрепил до 4 июля, связали бы с ними AddressId 12, а заказы, размещенные на 4 июля или после него, имеют AddressId 123123.
Повторите этот шаблон с каждой таблицей, которая должна сохранять исторические данные.
У меня есть третий подход, но поиск трудно. Я использую это только в одном приложении, и это действительно хорошо работает в этом единственном экземпляре, который имел некоторые довольно специфические бизнес-потребности для восстановления данных точно так же, как и в определенный момент времени. Я бы не использовал его, если бы у меня не было подобных бизнес-потребностей.
В определенном состоянии сериализуйте данные в документе Xml или другом документе, который вы можете использовать для восстановления данных. Это позволяет сохранять данные так, как это было в то время, когда оно было сериализовано, сохраняя оригинальную структуру таблицы и ссылки.
Чтобы иметь уникальные имена продуктов, вы можете добавить таблицу с именами продуктов, где имя является pk, и ссылка на эту таблицу из PRODUCT_VERSION –
@OweJessen У вас может быть таблица LATEST_PRODUCT_VERSION с уникальным именем, но это не так считать «декларативным» решением, так как вам придется вручную вставлять и удалять строки в этой таблице при создании новых версий продукта. Если вы не используете СУБД, которая может автоматически обновлять материализованные представления и обеспечивать их уникальность (например, индексированные представления MS SQL Server), поэтому сама СУБД поддерживает LATEST_PRODUCT_VERSION для вас. –