OneToMany RelationShip的学说表现

时间:2012-08-03 06:12:07

标签: php performance doctrine-orm one-to-many

我想知道OneToMany Realationship是否会妨碍应用程序的性能。比如说,城市和用户实体属于OneToMany关系,这意味着城市可以包含大量用户。现在,在实体类中设置关系后,每当我检索一个城市时,我都可以通过以下方式获取用户:

$users = $city->getUsers();

现在,我想知道内部架构。每当我检索城市时,它还会查询所有用户吗?如果是这样,假设一个城市可以有10000个用户。现在不是一个性能问题,我只检索一个城市,但它与所有10000用户相处?或者,它使用了其他一些机制,我完全可以实现它吗?

希望得到专家的解释以及有关这种情况的最佳做法的建议。提前谢谢。

1 个答案:

答案 0 :(得分:1)

好吧,我不是专家,但我可以分享一些你可以在应用程序开发时考虑的好的做法:

取= “EXTRA_LAZY”

默认情况下,doctrine 2.0将加载整个集合并存储它。在像你这样的场景中,用户集合可能是表格尺寸的性能问题。那么,为什么不把这段关系标记为EXTRA_LAZY?只有在访问时才会加载具有此获取模式的实体,而不会触发集合的完整加载。

/**
 * @ManyToMany(targetEntity="User", mappedBy="cities", fetch="EXTRA_LAZY")
 */

允许此提取模式,您可以强大地使用slide()count()等功能。例如:

$users = $em->getRepository('models\User')->findAll();
echo  $users->count();

代码触发像select count(*) from users..这样的sql语句,而不是循环遍历$ user集合。

保湿物品

并非总是需要加载实体集合。如果您要创建博客系统,我们只需提供帖子标题列表。 Hydrating objects用于只读目的可以证明这种基础结构。

有用的链接

一些链接可以将您引导至官方学说文档指南。

相关问题