我想知道OneToMany Realationship是否会妨碍应用程序的性能。比如说,城市和用户实体属于OneToMany关系,这意味着城市可以包含大量用户。现在,在实体类中设置关系后,每当我检索一个城市时,我都可以通过以下方式获取用户:
$users = $city->getUsers();
现在,我想知道内部架构。每当我检索城市时,它还会查询所有用户吗?如果是这样,假设一个城市可以有10000个用户。现在不是一个性能问题,我只检索一个城市,但它与所有10000用户相处?或者,它使用了其他一些机制,我完全可以实现它吗?
希望得到专家的解释以及有关这种情况的最佳做法的建议。提前谢谢。
答案 0 :(得分:1)
好吧,我不是专家,但我可以分享一些你可以在应用程序开发时考虑的好的做法:
默认情况下,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用于只读目的可以证明这种基础结构。
一些链接可以将您引导至官方学说文档指南。