我正在设计一个核心数据应用,需要保留过时的记录。
想象一下,用户使用该程序一段时间后会存储一些记录。然后,用户更改重要的属性和关系(超越单个记录),并继续使用具有此新配置的程序。想象一下,用户回顾了第一批记录。我想以某种方式存储旧配置,以便当用户查看任何给定记录时,更改的数据(我重复,超越单个记录)看起来就像写入记录时那样。 (请注意,需要记录的更改类型非常罕见。)
每次进行更改时,存储按日期提交的整个对象图的副本显然很糟糕(尽管 提供行为如果我上面的描述不可理解,我会寻求。)
我考虑过每次只存储更改的对象,并通过整理所有以前的时间段来获取任何给定记录的最新图表。 (如果是这种情况,我怎么跟踪多对象中对象的缺少,我想知道?我能不能为NSManagedObject编写一些东西,或者会我需要将此功能添加到每个相关实体吗?)
是否有更简单或更好的方法来执行此类与日期相关的数据存储?
答案 0 :(得分:3)
由于您需要存储旧关系以及单个对象,因此您实际上无法选择以某种方式保存旧对象图的快照。
有以下几种选择:
(1)如果变化很少且图表很小,那么保存整个对象图的快照可能是最简单和最强大的解决方案。为什么为很少使用的功能增加复杂性?
(2)对所有关系使用获取的关系。获取谓词将获取日期戳。这样做的缺点是复杂性。您必须为每个关系配置一个提取,并且没有任何内容可以自动运行。上下文也不能轻易地强制执行图完整性。
(3)链接堆栈:每个实体都有一个前一个和下一个关系,指向它自己的上一个和下一个版本。当属性/关系发生变化时,新对象及其关系目标的新对象将被推送到各自的链接堆栈上。每次进行更改时,这都会克隆一大块图形。找到上一个图表将是走过前一个关系的问题,直到找到正确的日期。
(4)关系实体:假设您有两个实体A
和B
。通常情况下,您只会拥有A<-->>B
之类的关系。但是,您需要保留旧关系,以便创建一个中间实体,其唯一任务是建模和跟踪A
和B
之间不断变化的关系。如下所示:
AlinkB {
dateStamp:Date;
a<-->>A.theBs;
b<<-->B.theA;
}
要查找以前的关系,您可以在关系中搜索正确的日期范围。您需要为每个子类定义子类,以便自动管理链接实体的添加和遍历。