Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm Doctrine2中关系实体(也是关系的实体)上的复合主键或代理主键_Doctrine Orm_Foreign Keys_Relationship_Composite Primary Key_Surrogate Key - Fatal编程技术网

Doctrine orm Doctrine2中关系实体(也是关系的实体)上的复合主键或代理主键

Doctrine orm Doctrine2中关系实体(也是关系的实体)上的复合主键或代理主键,doctrine-orm,foreign-keys,relationship,composite-primary-key,surrogate-key,Doctrine Orm,Foreign Keys,Relationship,Composite Primary Key,Surrogate Key,我有一个大型数据库,其中有关系实体。这正是因为在《条令2》手册中:我需要在我们的关系中存储额外的属性,因此关系成为一个实体 通常我们对实体使用生成的ID,对关系使用复合键。在这种情况下,实体是一种关系,这使得选择更加复杂… 请注意,我这里不是在说自然键。我使用的是一个复合键,它由id组成,id是在各自拥有的实体中使用自动递增策略创建的整数 我看到在关系实体上使用复合主键的一些缺点: 我需要在创建实体及其关系之间调用persisten-in(在我可以将实体上的键用作复合主键中的外键之前生成该键)

我有一个大型数据库,其中有关系实体。这正是因为在《条令2》手册中:我需要在我们的关系中存储额外的属性,因此关系成为一个实体

通常我们对实体使用生成的ID,对关系使用复合键。在这种情况下,实体是一种关系,这使得选择更加复杂…

请注意,我这里不是在说自然键。我使用的是一个复合键,它由id组成,id是在各自拥有的实体中使用自动递增策略创建的整数

我看到在关系实体上使用复合主键的一些缺点:

  • 我需要在创建实体及其关系之间调用persisten-in(在我可以将实体上的键用作复合主键中的外键之前生成该键)
  • 要将其他实体与关系实体关联起来,我们需要在这些实体中再次为复合键中使用的ID添加列。如果我要使用代理主键,我只需要一列保存该id
我还看到了使用组合键的一些优点,例如:

  • 它们消除了对某些联接查询的需要,相反,您可以构建查询来使用组合键直接提取信息
但是目前使用复合关键点的最重要的论据是:

  • 当用户和某个实体之间的关系被删除并随后再次创建时(在我们的应用程序模型中可能会发生这种情况),我们也需要恢复对所有其他相关实体的访问。 如果用户和SomeEntity之间的关系是使用代理主键上的自动增量策略创建的。恢复的(新)关系将获得新的主键(id)。因此,相关实体(使用“旧”键存储)不再可访问。 如果我在关系上使用复合键,我可以简单地恢复关系(它得到相同的复合键值),这样我就可以立即再次访问其他相关实体
有没有人有过类似的经历?是否有其他解决方案使其正常工作。(使用ORM时)是否有我遗漏的重要缺点或优点

我可以想到的另一种方法是,向User-SomeEntity关系添加一个状态。我们可以将状态更改为禁用、启用,而不是删除条目。这样我们就可以使用代理键而不是复合键,因为条目永远不会被删除

非常感谢您的反馈


对于感兴趣的人来说,这里还讨论了堆栈溢出上的代理键与复合键:

我建议将您的两个外键设置为复合主键

您的关联实体将由其两个关系的ID标识

理论上,Doctrine的UnitOfWork/CommitterDerCalculator应该能够以正确的顺序插入元素,因此,您不必处理持久化顺序

您的映射在结尾处如下所示(注释示例):


我建议将您的两个外键设置为复合主键

您的关联实体将由其两个关系的ID标识

理论上,Doctrine的UnitOfWork/CommitterDerCalculator应该能够以正确的顺序插入元素,因此,您不必处理持久化顺序

您的映射在结尾处如下所示(注释示例):