假设我有4个表:Posts
,Likes
,Comments
和Files
.现在我想 Select 一个特定帖子的所有喜欢, comments 和文件,比如在实体框架中使用LINQ.这很简单,只要做这样的事情:
var post = m_dbContext.Posts
.Include(x => x.Likes)
.Include(x => x.Comments.OrderBy(c => c.CreatedAt))
.Include(x => x.Files)
.FirstOrDefault(x => x.Id == id);
现在假设我们的帖子有100条赞记录、10条 comments 和5个文件.数据库的结果将有100x10x5=5k行.值得注意的是,对于Like和Comment的每个组合,所有选定的文件记录都将被复制.可以通过在SQL查看器中执行此查询来确认这一点.
最后,让我们假设每个文件记录平均有100KB的数据(比方说一个Base64编码的字符串).
这是否意味着,当执行上述查询时,由于联接导致的行"冗余",数据库将不得不通过网络将价值超过5k x 100kb=500MB的数据从数据库传输到服务器?或者,在数据库发送非冗余数据而实体框架将重新构建它的幕后,是否存在一些聪明的做法?当我手动执行查询时,我在UI中只得到了5k行.
我在哪里可以了解到关于这个问题的更多信息?