为什么建议在ORM中避免双向关系?

时间:2017-02-07 09:04:29

标签: orm doctrine-orm

不建议实体之间的双向关系有哪些技术原因?它是否会影响ORM的性能? (如果是这样,为什么?)

来源:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/best-practices.html#constrain-relationships-as-much-as-possible

https://ocramius.github.io/doctrine-best-practices/#/86

2 个答案:

答案 0 :(得分:2)

在你提到的第一个来源中提到了三个原因:

  

这有几个好处:

     
      
  • 域模型中的耦合减少
  •   
  • 您的域模型中的更简单的代码(无需正确维护双向性)
  •   
  • 较少为Doctrine工作
  •   

在第二个:

  

双向协会是开放的

我认为这些是为什么。 “减少工作原则” “是开销” 最有可能意味着它会影响性能,我不会知道怎么解释那个...

有道理,因为只要你在双向关系中改变某些东西,ORM就需要更新双方。

答案 1 :(得分:0)

除了源代码中提到的原因(以及Wilt的回答)在实体之间存在很多关系,因此更容易违反单一责任并使代码更复杂。

举个例子,我想从代码的某个部分更新用户的电话号码。我目前只能访问用户所属的组织。如果我在实体之间有完整的连接路径,我可以这样做:

foreach ($organization->getDepartments() as $department) {
  if ($department->getName() == 'sales') {
    foreach ($department->getMembers() as $member) {
      if ($member->getName == 'Kevin') {
        $member->setPhoneNumber(012343929394);
      }
    }
  }
}

这是个人偏好,但我认为让这类事情难以做是一个好主意。相反,您将在专用服务中从数据库中获取基于名称的成员以编辑用户信息。这意味着您的逻辑更加封装。如果UserEditService无法访问任何地方的所有内容,那么处理代码的新开发人员将更有可能寻找它。