我有NewsFeed
的表格
NewsFeed
+ id
+ fromUserId
+ targetId
+类型
所以新闻是这样的:Tom Wakefield
对Peter Smith
的个人资料发表了评论。
所以我要在NewsFeed
来电fromUserName
和targetUserName
或
对于我在dataTable中显示的每一行,我都会从Entity
查询。
<p:dataTable value="#{myBean.news}" var="item">
<p:column>
<h:outputText value="#{myBean.getName(item.fromUserId)} " />
<h:outputText value="commented on " />
<h:outputText value="#{myBean.getName(item.targetId)}" />
</p:column>
</p:dataTable>
然后在myBean.java
myBean.java
public String getName(Long userId){
User u = mySessionBean.findUserById(userId);
return u.getFName() + " " + u.getLName();
}
哪种方式更好?在每一行中进行查询确实在性能方面给我带来了很多伤害
注意:数据库期望拥有大量用户。 News
经常展示。
答案 0 :(得分:1)
“正常化直到它受伤,反规范化 直到它工作“
IOW:仅记录ID并使用JOIN获取整个数据。
答案 1 :(得分:1)
在每一行中进行查询确实在性能方面给我带来了很多伤害
没有
复制数据会导致比解决的问题更多的问题。
重复关系使更新几乎无法正确处理。
对象关系管理器可以 - 并且经常 - 生成适当的SQL连接以优化提取。 ORM也有缓存。数据库有缓存。
第二和第三范式符合以下规则:不重复关系。
在极少数情况下,您可以“非规范化”并提高性能,而无需创建复杂的更新逻辑。在大多数其他情况下,重复的数据会导致更新和插入复杂或缓慢或两者兼而有之。