Database design 数据库和深度复制

Database design 数据库和深度复制,database-design,orm,Database Design,Orm,如果我发现自己想要对存储在关系数据库中的对象进行深度复制,我是否一定在架构上做了一些根本错误的事情?这是我问的另一个(更详细)问题的另一个角度,但没有得到太多回应。不一定。为了实现版本控制方案,我自己已经成功地完成了这项工作。基本上,可以对整个图进行版本控制(使用compite键,其中键的一部分是thing id,另一部分是版本号),我们可以轻松访问所有以前版本的图或子图 明确地说,DB架构师推荐了该方案;他的意见很有分量,解决方案不是我的第一选择。但最终它运行得非常好。通常,如果复制父对象,您

如果我发现自己想要对存储在关系数据库中的对象进行深度复制,我是否一定在架构上做了一些根本错误的事情?这是我问的另一个(更详细)问题的另一个角度,但没有得到太多回应。

不一定。为了实现版本控制方案,我自己已经成功地完成了这项工作。基本上,可以对整个图进行版本控制(使用compite键,其中键的一部分是thing id,另一部分是版本号),我们可以轻松访问所有以前版本的图或子图


明确地说,DB架构师推荐了该方案;他的意见很有分量,解决方案不是我的第一选择。但最终它运行得非常好。

通常,如果复制父对象,您只希望复制对子对象的引用,而不希望复制对象本身。但是,在某些情况下,例如在给定时间点保留对象的状态,需要复制子对象。因此,为了回答您的问题,这种情况应该让您停下来思考,但不一定意味着您做错了什么。

我的看法是,如果您需要一个数据库对象的弹性克隆,那么最好的办法是执行深度复制-至少复制将来某个时候可能更改的所有项目。我认为除了实现某种“克隆”的“写时复制”样式之外,没有其他选择。虽然在某些情况下这种样式可能是正确的,但会引入大量额外的逻辑和复杂性。

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

另一方面,有两个表“Department”和“Employees”,一个部门的正确副本很可能不是深度副本(至少,如果每个员工在一个时间点恰好与一个部门关联)。在关系数据库方案中,这些差异通常与分配给关系的引用完整性检查同时发生。关系“Postings”->“Text_line”可以使用具有“ON DELETE CASCADE”完整性的外键约束进行建模(当然,如果您的数据库支持的话)。然而,“部门”->“员工”不应该有这样的“删除级联”检查