我想知道OneToMany Realtionship是否会影响应用程序的性能。比如说,城市和用户实体是OneToMany关系,这意味着一个城市可以包含很多用户。现在,在实体类中设置了关系后,每当我检索到一个城市时,我都可以通过获取其用户
$users = $city->getUsers();
现在,我想知道内部架构。每当我检索城市时,它也会查询所有用户吗?如果是这样的话,假设一个城市可以有10000个用户。现在,我只检索一个城市,但它也能与所有10000名用户相处,这不是一个性能问题吗?或者,它使用了一些其他的男性主义,而我完全同意它的实施?
希望从您的专家那里得到解释,并就这种情况的最佳实践提出建议。提前谢谢。
好吧,我不是专家,但我可以与您分享一些在应用程序开发时可以考虑的好做法:
fetch="EXTRA_LAZY"
默认情况下,条令2.0将加载整个集合并将其存储在内存中。在像您这样的场景中,用户集合可能会因表的大小而出现性能问题。那么,为什么不将这段关系标记为EXTRA_LAZY呢?只有在访问时才加载具有此获取模式的实体,而不会触发集合的完全加载。
/**
* @ManyToMany(targetEntity="User", mappedBy="cities", fetch="EXTRA_LAZY")
*/
允许这种获取模式,您可以稳健地使用slide()
和count()
这样的函数。例如:
$users = $em->getRepository('modelsUser')->findAll();
echo $users->count();
该代码触发一个类似select count(*) from users..
的sql语句,而不是在$user集合中循环。
水合物体
加载实体集合并不总是必需的。如果你正在创建一个博客系统,我们只需要提供一个帖子标题列表。此基础结构可以通过用于只读目的的水合对象进行改进。
有用的链接
一些链接,引导你到官方学说文件指南。
- 提高性能
- 原则2,最佳实践