Я изучаю Morphia, но перепутал с DBRef - PullRequest
3 голосов
/ 22 мая 2011

1

@Entity
public class Blog {
   @Id ObjectId id;
   @reference User author;
   String content;
}

или

2

@Entity
public class Blog {
   @Id ObjectId id;
   ObjectId authorId;
   String content;
}

какой из них выбрать?

eveytime blogDAO.get (id); первый каждый запрос будет загружать все данные пользователя, это может быть очень медленным или тратить время?

Ответы [ 3 ]

2 голосов
/ 23 мая 2011

Я предлагаю # 3;):

@Entity
public class Blog {
   @Id ObjectId id;
   ObjectId authorId;
     ...
   String firstName;
   String lastName;
     ...
   String content;
}

Mongodb хорошо подходит для денормализации данных, поэтому я считаю, что вам нужно добавить некоторые пользовательские данные в сообщение блога для быстрого отображения списка сообщений блога,В случае, если вам нужно больше информации о пользователе, чем есть в документе блога (например, для отображения блога), вы можете сначала загрузить блог, а затем пользователя.Также вам необходимо обновить данные пользователя в каждом блоге пользователя, когда он обновляет свой профиль.

1 голос
/ 14 июля 2011

Я бы предложил что-то вроде:

@Entity
public class Blog {
   @Id ObjectId id;
   @Reference(lazy = true) User author;

А также наличие денормализованных полей. Таким образом, вы получаете доступ к объекту User, но Morphia загружает его только при необходимости.

Примечание: вам нужно cglib и proxytools в вашем classpath, чтобы это работало. Смотри: http://code.google.com/p/morphia/wiki/Dependencies

0 голосов
/ 23 мая 2011

Взгляните на эту статью, http://valyagolev.net/article/mongo_dbref/. Она дает некоторую информацию о DBRefs.

Многое зависит от вариантов использования, но на самом деле, общее правило - избегать DBRef, если в этом нет крайней необходимости. Если вы можете уйти (сделайте каждую попытку сделать это) с использованием встроенных свойств, вы должны сделать это.

Но если ваши шаблоны доступа таковы, что вы на самом деле не получаете элемент, на который ссылаетесь, у родителя, тогда вы можете использовать простые ссылки на основе objectid вместо dbref.

...