数据库和深层复制

时间:2010-07-15 21:06:08

标签: database-design orm

如果我发现自己想要对存储在关系数据库中的对象进行深层复制,那么我是否必然在架构上做了一些根本错误的事情?对于我提出的另一个(更详细的)问题,这是一个不同的角度,但对被叫Copying Relational Table Data没有得到太多回应。

4 个答案:

答案 0 :(得分:2)

不一定。我自己做了这个,并且很成功地实现了版本控制方案。基本上整个图形都可以进行版本化(使用compite键,其中键的一部分是事物ID而另一部分是版本号),我们可以轻松访问所有以前版本的图形或子图形。

要明确的是,DB Architect推荐了这个方案;他的意见很重,解决方案不是我的第一选择。但最终它的效果非常好。

答案 1 :(得分:2)

通常,如果复制父对象,则只想复制对子对象的引用,而不是对象本身。但是,有些情况,比如在给定时间点保留对象的状态,需要复制子对象。所以,要回答你的问题,这个场景应该让你停下来思考,但并不一定意味着你做错了什么。

答案 2 :(得分:2)

我对此的看法是,如果您需要数据库对象的弹性克隆,那么您最好的选择是执行深层复制 - 至少复制所有可能在将来某些时候发生变化的项目。我没有看到除了实现“克隆”的一些写时复制风格之外还有很多选择,虽然在某些情况下它可能是正确的,但会引入一大堆额外的逻辑和放大器。复杂性。

答案 3 :(得分:1)

这取决于您的关系表所代表的内容,以及您将哪些实体组合在一起以构建“业务对象”。例如,如果您有一个内容管理系统的关系模型,其中包含表“Postings”和一个表“Text_lines”,其中每个Posting都包含一个文本行列表,那么您的业务对象“Posting”的有效副本很可能是“Postings”实体的深层副本以及所属的Text_lines实体。

另一方面,有两个表“Department”和“Employees”,一个部门的正确副本很可能不是一个深层副本,(至少,如果每个员工在一个点上只与一个部门相关联)时间)。在关系数据库方案中,这些差异通常与分配给关系的参照完整性检查同时进行。关系“Postings” - >“Text_lines”可以使用具有“ON DELETE CASCADE”完整性的外键约束建模(当然,如果您的数据库支持该关键字)。 “部门” - >但是,“员工”不应该对其进行“ON DELETE CASCADE”检查。