【发布时间】:2010-07-17 15:38:48
【问题描述】:
我有一个应用程序,我想在其中拍摄所有实体的快照,创建代表特定时间点的克隆表。然后,我希望能够比较这些快照之间的差异,以了解数据如何随时间演变。
您将如何在 NHibernate 中完成此任务? NH 似乎不是为这种类型的数据操作而设计的,我不确定我是在滥用我的数据库、NH 还是两者兼而有之。
(PS 由于数据库引擎的限制,我无法使用视图或存储过程。)
【问题讨论】:
标签: nhibernate
我有一个应用程序,我想在其中拍摄所有实体的快照,创建代表特定时间点的克隆表。然后,我希望能够比较这些快照之间的差异,以了解数据如何随时间演变。
您将如何在 NHibernate 中完成此任务? NH 似乎不是为这种类型的数据操作而设计的,我不确定我是在滥用我的数据库、NH 还是两者兼而有之。
(PS 由于数据库引擎的限制,我无法使用视图或存储过程。)
【问题讨论】:
标签: nhibernate
您真的需要在此快照中保存每个实体的全部内容吗?如果是这样,那么名称为 type_snapshot 的表的集合可能会有所帮助。您可以将实体保存到此表中(仅插入,从不更新)。您可以存储原始项目的标识符,并为快照本身生成一个新的标识符。您可以保存每个快照的时间戳。您的 item_snapshot 表如下所示:
id | snapshot_date | item_id | item_prop1 | item_prop2 ...
123 | 7/16/10 | 15 | "item desc" | "item name" ...
在您的域中,也许您可以使用快照实例(包含 id 和快照日期的快照,以及 T 的实例)
这可能并不理想,因为它会引入第二组映射,但它是一种到达目的地的方法。看起来你最好做一些更接近数据库引擎的事情,但是如果不知道你对这些快照有什么想法(从应用程序的角度来看),这很难说。
【讨论】:
我最终用快照 id 列扩充了我的实体,并将条目复制到表中的适当位置。结合过滤器,我可以从任何给定的快照中进行选择。不得不对遗留代码做一些补丁,但它基本上可以工作。
【讨论】:
我们最终创建了重复的表,其中包含用于快照的时间戳类型的额外列。使主表上的索引更小,因为我们有 1000 万 + 行,因此在同一个表中添加版本会创建更多记录。还有不同表空间中的版本表(mssql 上的 db 文件)
【讨论】: