2012-12-13 40 views
1

給出一個簡單的例子如下,我想要一些關於是否存儲爲單個文檔vs多個文檔的指導。RavenDB建模 - 單個文檔還是多個文檔?

class User 
{ 
    public string Id; 
    public string UserName; 
    public List<Post> Posts; 
} 

class Post 
{ 
    public string Id; 
    public string Content; 
} 

一旦數據被存儲,有時我會希望給定用戶的所有帖子。有時候我可能想要滿足特定條件的多個用戶的帖子。

我應該將每個用戶存儲爲文檔(嵌入了帖子)嗎?還是將用戶和帖子存儲爲單獨文檔更有意義,並且在我的帖子中有某種標識將其鏈接回用戶?

現在,如果每個用戶屬於某個組織(在我的應用程序中將有數百個組織),該怎麼辦?

class Organization 
{ 
     public string Id; 
     public List<User> users; 
} 

我應該用單文檔方法嗎?在這種情況下,我會爲每個組織存儲一個巨大的文檔,其中將包含嵌入式用戶,而嵌入式用戶又包含嵌入式帖子?

回答

3

您應該將它們保存爲單獨的文檔。用戶,組織和帖子是聚合實體的很好例子,在Raven中,每個聚合通常都是它自己的文檔。

只有不是聚合的實體應嵌套在同一個文檔中。例如,在Post中你可能有一個List<Comment>。評論和發佈都是實體,但只有Post是一個聚合。

而是應該將它們與參考型號:

public class User 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public List<string> PostIds { get; set; } 
} 

public class Post 
{ 
    public string Id { get; set; } 
    public string Content { get; set; } 
} 

public class Organization 
{ 
    public string Id { get; set; } 
    public List<string> UserIds { get; set; } 
} 

您可以選擇非規範化的一些數據到在適當的引用:

public class UserRef 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

public class Organization 
{ 
    public string Id { get; set; } 
    public List<UserRef> Users { get; set; } 
} 

非規範化的用戶名進入組織的文檔中有顯示組織時無需獲取每個用戶文檔的好處。但是,它有一個缺點,即每次更改用戶名時都必須更新組織文檔。每次考慮關係時,你應該權衡這個利弊。對所有情況都沒有正確的答案。

此外,你應該考慮如何真正使用數據。在實踐中,你可能會發現你的Organization類可能根本不需要用戶列表。相反,您可以在User類上放置一個字符串OrganizationId屬性。這將更容易維護,並且如果您想要組織中的用戶列表,則可以使用索引查詢該信息。

您應該在有關Document Structure DesignHandling Document Relationships的烏鴉文檔中閱讀更多信息。