如何在 ORM 中有效地映射集合?
How to map a collection efficiently in an ORM?
我有一个包含两个实体的简单模型:
- Post entity - 聚合根,可以有一个 Comment -> Comments
列表
- 评论实体
添加新评论时,假设是这样的:
post.Comments.Add(newComment);
系统将请求 SELECT 在添加新评论之前加载所有现有评论。但如果有数百条评论,那么它就很重了。是否可以避免负载?感谢您的任何建议。
这是 ORM 的经典问题。这里没有灵丹妙药。
如果您提前加载所有评论,则会导致大量带宽浪费,因为可能不需要所有评论。
另一方面,如果您没有提前加载评论而有人做了类似的事情:
for(var i = 0; i < 100; i++){
doSomethingWith(post.Comments[i]);
}
您导致从数据库中提取一百次 - 实际上导致了 Select n+1 issue。
所以,这是一个固执己见的设计选择,一些 ORM 只会获取 post,其他的会包含特殊语法,如 .Include
,这表明你也对评论感兴趣,而有些则会忽略这完全是浪费请求。
您担心插入新评论的性能,所以以下选项可能会有所帮助:
- 重用来自 nhibernate 的数据库连接,编写自己的插入命令
- 在 Dapper 的支持下,编写您的插入查询 https://github.com/StackExchange/dapper-dot-net
我有一个包含两个实体的简单模型:
- Post entity - 聚合根,可以有一个 Comment -> Comments 列表
- 评论实体
添加新评论时,假设是这样的:
post.Comments.Add(newComment);
系统将请求 SELECT 在添加新评论之前加载所有现有评论。但如果有数百条评论,那么它就很重了。是否可以避免负载?感谢您的任何建议。
这是 ORM 的经典问题。这里没有灵丹妙药。
如果您提前加载所有评论,则会导致大量带宽浪费,因为可能不需要所有评论。
另一方面,如果您没有提前加载评论而有人做了类似的事情:
for(var i = 0; i < 100; i++){
doSomethingWith(post.Comments[i]);
}
您导致从数据库中提取一百次 - 实际上导致了 Select n+1 issue。
所以,这是一个固执己见的设计选择,一些 ORM 只会获取 post,其他的会包含特殊语法,如 .Include
,这表明你也对评论感兴趣,而有些则会忽略这完全是浪费请求。
您担心插入新评论的性能,所以以下选项可能会有所帮助:
- 重用来自 nhibernate 的数据库连接,编写自己的插入命令
- 在 Dapper 的支持下,编写您的插入查询 https://github.com/StackExchange/dapper-dot-net