2010-10-12 1 views
0

У меня есть таблица NewsFeed.
NewsFeed
+ идентификатор
+ fromUserId
+ targetId
+ типДизайн базы данных: большая таблица и запрос объекта для каждой строки в dataTable

поэтому новость выглядит так: Tom Wakefield прокомментировал профиль Peter Smith «s.

Так либо добавить еще два поля в мой 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 отображаются очень часто.

ответ

1

«нормализовать, пока не болит, денормализовать , пока он не работает»

IOW: запись только идентификаторы и использовать JOIN и получить всю информацию.

+0

Благодарим вас за ввод +1 –

1

ли сделать запрос в каждой строке действительно больно мне много в плане производительности

No.

Дублирование данных вызывает больше проблем, чем решает.

Дублированные отношения делают обновления практически невозможными для правильной обработки.

Объектно-реляционные менеджеры могут - и часто - создавать собственные SQL-соединения для оптимизации выборки. Также у ORM есть кеш. И в базе данных есть кеш.

2-я и 3-я нормальные формы соответствуют следующему правилу: Не дублировать отношения.

В редких случаях вы можете «денормализовать» и повысить производительность без создания сложной логики обновления. В большинстве других случаев дублированные данные приводят к обновлениям и вставкам, которые либо сложны, либо медленны, либо оба.

+0

Благодарим вас за ввод. Я отвечу на ваш совет. +1 –