13

在 Doctrine 手册中,在尽可能地约束关系下,它给出了“消除不必要的关联”和“尽可能避免双向关联”的建议。我不明白什么标准会使关联“必不可少”。

我这样说是因为您似乎经常想要从一对多关联的一侧而不是从多侧。例如,我想获取用户的所有活动电话号码,而不是获取所有活动电话号码及其关联的用户。当您必须遍历多个一对多关系时,这一点变得更加重要,例如,如果您想查看过去两天内有未接来电的所有用户(未接来电->电话号码->用户)。

这就是简单情况下反向关联的样子:

SELECT * FROM User u
LEFT JOIN u.PhoneNumbers p WITH p.active

如果有一种方法可以在 DQL 中以相反方向遍历给定关系,这将更明智,例如以下原始 SQL:

SELECT * FROM User u
LEFT JOIN PhoneNumber p ON p.User_id = u.id AND p.active

有人可以解释他们为什么给出这个建议,在什么情况下值得忽略?

- 编辑 -

如果有缓解因素或其他解决方法,请给我简单的示例代码或链接。

当未定义逆关系时,我看不到任何方法来遍历关系的逆,因此我将假设构建自定义 DQL实际上不是解决方案——有些连接对 SQL 来说是微不足道的,而使用 SQL 是不可能的DQL,和水合作用可能无论如何都行不通。这就是为什么我不明白为什么添加逆关系是一个坏主意。

4

2 回答 2

4

使用 Doctrine,我只在需要时定义关系。这意味着定义的所有关系实际上都在代码库中使用。

对于有大型团队在项目的不同领域工作的项目,并不是每个人都会习惯 Doctrine,它是当前的配置,以及急切/懒惰的加载关系。如果您在非必要且可能没有意义的情况下定义双向关系,则可能会导致对以下数据的额外查询:

  1. 不能使用
  2. 之前可能已被选中

仅定义基本关系将使您能够更好地控制您和您的团队如何遍历您的数据并减少额外或过大的查询

2011 年 8 月 22 日更新

我所说的基本关系是指你使用的那些。定义一个你不会使用的关系是没有意义的。例如:

  • \Entity\Post与两者都有明确的关系,\Entity\User并且\Entity\Comment
    • 用于$post->user获取作者
    • 用于$post->comments获取所有评论
  • \Entity\User与两者都有明确的关系,\Entity\Post并且\Entity\Comment
    • 用于$user->posts获取所有用户帖子
    • 用于$user->comments获取所有用户评论
  • \Entity\Comment只与\Entity\User
    • 用于$comment->user获取作者
    • 无法使用,因为我没有在我的应用程序中$comment->post检索它所属的帖子

我不会将它们视为“反向”关系。如果在两个方向上使用数据是有意义的,则将它们视为“双向”。如果它没有意义,或者您不会那样使用数据,请不要定义它。

我希望这是有道理的

于 2011-08-20T02:54:50.937 回答
2

我认为这是一个很好的问题,并期待其他人的回答。

一般来说,我将您在以下经验中引用的建议解释为:

如果我不需要访问实体内部的(反向)关联,那么我通常将其设为单向。在您的用户和(未接)呼叫示例中,我可能会保持单向,并让一些服务类或存储库处理组合自定义 DQL,以便在我需要获取最近未接呼叫的所有用户列表时出现奇怪的情况。这是我认为例外的情况——大多数时候,我只对特定用户的呼叫感兴趣,所以单向关系有效(至少在我有这么多记录以至于我觉得需要优化之前) .

于 2011-08-10T00:40:41.750 回答