我有一个大型数据库,我有实体关系。这完全是因为Doctrine 2手册中的the following comment:我需要在我们的关系中存储其他属性,因此关系成为一个实体。
通常我们使用生成的id作为实体,使用复合键来表示关系。在这种情况下,实体是一种关系,因此使选择更复杂......
请注意这里我不是在谈论自然键。我正在使用一个复合键,它由id组成,它们是在各自拥有的实体中使用自动增量策略创建的整数。
我发现在关系实体上使用复合主键存在一些缺点:
我还看到了使用复合键的一些优点,例如:
但现在使用复合键的最重要的论点如下:
有没有人有类似情景的经验?是否有其他解决方案可以使其正常工作。我错过了任何重要的缺点或优点(当使用Doctrine ORM时)。
我能想到的另一个选择是向User SomeEntity关系添加一个状态。我们可以将状态更改为禁用状态,而不是删除条目。通过这种方式,我们可以使用代理键而不是复合键,因为该条目永远不会被删除...
非常感谢反馈......
对于感兴趣的人来说,还有关于Stack Overflow上的代理与复合键的讨论:(click)
答案 0 :(得分:1)
我建议让你的两个外键成为复合主键。
您的关联实体将通过其两个关系的ID来识别。
理论上,Doctrine的UnitOfWork / CommitOrderCalculator应该以正确的顺序插入元素,因此,您不必处理持久性命令。
你的映射在最后看起来像这样(注释示例):
<?php
class UserGroup
{
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\Id
**/
public $user;
/**
* @ORM\ManyToOne(targetEntity="Group")
* @ORM\Id
**/
public $group;
}