我有一个关于在某些情况下处理数据集的应用程序设计问题。
假设我有一个使用某些实体的应用程序。我们有一个订单,包含有关客户,截止日期等的信息。然后我们有一个服务实体与订单有一对多的关系。服务包含它的名称。除此之外,我们还有一个规则实体,它设定了一些关于从物料库存中扣除的规则。它与服务实体有一对多的关系。
现在,我的问题是:如何处理情况,当我创建一个Order时,我将它持久化到数据库,与它的关系,但同时,我不希望对发生的实体进行更改与生成的订单可见的关系。我需要将Order和与之关联的数据视为某种日志,以便从表中删除服务或更改一组规则,并不会更改已生成的订单,服务和规则。这个过程。
通常,我将如何处理,将复制服务和规则,并将其插入新表,以便数据独立于订单生成期间使用的数据。订单只会指向重复的数据,而不是原始数据,这将解决我的问题。但这是数据重复,而且我认为,这不是最好的方法。
所以,如果你理解我的问题,你知道解决这类问题的任何更好的想法吗?如果我写的内容没有任何意义,我很抱歉。告诉我,我会尝试以更好的方式表达自己。
答案 0 :(得分:0)
我心不在焉地看着同样的情况,所以我想分享一些想法。
我们的想法是将需要版本控制的每个实体视为对象并存储在数据库对象的实例中。比方说,对于service
实体,这可以表示为:
service
表,仅包含service_id
列,PrimaryKey; service_state
(或..._instance
)表,其中包含:
service_id
,service.service_id
的外键; state_start_dt
,此状态变为活动状态的时刻NOT NULL
; state_end_dt
,这个状态已经过时的时刻,NULL
能够; service
; service_id
+ state_start_dt
。state_start_dt::state_end_dt
范围不能重叠,应该受到约束。state_start_dt
戳记的适当记录来提前完成新配置的交付; service.service_id
,而信息保存在从属表service_state
中。当service
存在时,这会导致出现这种情况,而有人(有意或有误)删除了所有service_state
条记录。state
条记录移到离线存档中的安全时间,因为只要系统中有实体引用service
,就应该检查它们删除任何state
记录之前的有效日期。service_state
中的记录。实际上,依赖state_end_dt
列也是错误的,因为服务可能已经激活一段时间然后被抑制。并且在活动期间查询服务应该表示服务处于活动状态。因此,status
列是必需的。我认为,记住这种方法的缺点,这是非常好的。 虽然我想从关系模型的角度听一些评论 - 特别是关于这种设计的缺点。
答案 1 :(得分:0)
我建议只在单独的快照表中复制数据。您当然可以在主表上使用版本控制方案,但我会质疑为减少重复数据而导致的额外复杂性有多少。我发现数据模型中的额外复杂性导致系统难以扩展。我会认为重复数据是2个邪恶中较小的一个。