数据库设计:更大的表与查询dataTable中每一行的实体

时间:2010-10-12 01:53:53

标签: performance database-design jsf data-modeling

我有NewsFeed的表格 NewsFeed
+ id
+ fromUserId
+ targetId
+类型

所以新闻是这样的:Tom WakefieldPeter Smith的个人资料发表了评论。

所以我要在NewsFeed来电fromUserNametargetUserName

中再添加两个字段

对于我在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经常展示。

2 个答案:

答案 0 :(得分:1)

  

“正常化直到它受伤,反规范化   直到它工作“

IOW:仅记录ID并使用JOIN获取整个数据。

答案 1 :(得分:1)

  

在每一行中进行查询确实在性能方面给我带来了很多伤害

没有

复制数据会导致比解决的问题更多的问题。

重复关系使更新几乎无法正确处理。

对象关系管理器可以 - 并且经常 - 生成适当的SQL连接以优化提取。 ORM也有缓存。数据库有缓存。

第二和第三范式符合以下规则:不重复关系。

在极少数情况下,您可以“非规范化”并提高性能,而无需创建复杂的更新逻辑。在大多数其他情况下,重复的数据会导致更新和插入复杂或缓慢或两者兼而有之。