我相信您知道,您面临的问题是数据库规范化的结果。解决此问题的方法之一可以从商业智能技术中获取 - 将数据以非规范化状态归档在数据仓库中。
标准化数据:
- 订单表
- 客户表
- 项目表
- 订单明细表
- ItemDetailId
- 订单编号
- 项目 ID
- 项目数量
- ETC
当查询和存储去规范化时,数据仓库表看起来像
- 订单编号
- 客户ID
- 顾客姓名
- 客户地址
- (其他客户字段)
- ItemDetailId
- 项目 ID
- 项目名称
- 项目价格
- (其他 OrderDetail 和 Item 字段)
通常,有某种计划的作业可以按计划将数据从规范化数据中提取到数据仓库中,或者如果您的设计允许,可以在订单达到特定状态时完成。(例如已发货)可能会在每次状态更改时存储记录(使用名为 OrderStatus 的字段跟踪当前状态),因此完全非规范化的数据可用于操作/履行过程的每个步骤。将数据归档到仓库的时间和方式将根据您的需要而有所不同。
以上涉及很多开销,但我知道的另一种常见方法会带来更多开销。
另一种方法是将表设为只读。如果客户想要更改他们的地址,您无需编辑他们现有的地址,而是插入一条新记录。
因此,如果我在 Jamnuary 第一次在您的网站上订购时的地址是 AddressId 12,那么我会在 7 月 4 日搬家,我会收到一个与我的帐户绑定的新 AddressId。(说 AddressId 123123,因为您的网站非常成功并吸引了大量客户。)
我在 7 月 4 日之前下的订单会关联到 AddressId 12,而在 7 月 4 日或之后下的订单会有 AddressId 123123。
对需要保留历史数据的每个表重复该模式。
我确实有第三种方法,但搜索它很困难。我只在一个应用程序中使用它,它实际上在这个单一实例中运行良好,它有一些非常具体的业务需求,可以完全按照特定时间点的方式重建数据。除非我有类似的业务需求,否则我不会使用它。
在特定状态下,将数据序列化为 Xml 文档或可用于重建数据的其他文档。这允许您将数据保存为序列化时的数据,保留原始表结构和相关性。