2011-05-22 73 views
3

我學習嗎啡,但困惑與DBREF

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

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

哪一個我應該選擇?

eveytime blogDAO.get(id);每一個查詢的第一個會加載所有的用戶數據, 可以是非常慢或浪費時間?

回答

2

我建議#3):

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

的MongoDB非常適合數據非規範化,所以我的觀點是,你需要爲了加入一些用戶相關的數據,以博客文章,以快速顯示博客文章列表。如果您需要更多用戶信息,然後存在於Blog文檔中(例如,用於博客顯示),則可以先加載博客,然後再加載用戶。當你更新他的個人資料時,你也需要更新每個用戶博客中的用戶數據。

+0

我很困惑,爲什麼這麼多morphia EXAMPLEs使用@References,它似乎通常被濫用,因爲morphia自動加載ref。在這個風景中:用戶{followinglist,followersList},我應該使用List 還是List ,如果我使用ref的時候我得到了一個用戶,我可以直接得到所有的followers,但是好像取回一個User會導致檢索遞歸的用戶網絡,似乎我必須做每個id在followersList查詢? – MouJian 2011-05-23 14:17:04

0

看看這篇文章,http://valyagolev.net/article/mongo_dbref/。它提供了關於DBRefs的一些信息。

很多事情取決於用例,但真的,一般的經驗法則是避免DBRefs,除非絕對需要。如果您可以使用嵌入式屬性離開(盡一切努力),您應該這樣做。

但是,如果你的訪問模式是這樣的,你真的沒有得到你所指的父項,那麼你可以使用基於objectid的簡單引用而不是dbref。

1

我建議是這樣的:

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

除了具有非規範化的領域。這樣你就可以訪問User對象,但是Morphia只會在需要的時候加載它。

注意:您需要在您的類路徑中使用cglib和proxytools才能正常工作。見:http://code.google.com/p/morphia/wiki/Dependencies