2014-09-11 81 views
4

在DocumentDb中,解耦數據以便將它們保存在單獨集合中的最佳方式和位置是什麼?將數據保存到DocumentDb中的多個集合中

到目前爲止,大多數關於如何使用DocumentDb管理數據的例子都使用簡單的對象,但在現實生活中,我們幾乎沒有做過。我只想了解在將它們保存爲DocumentDb中的Json對象之前,我需要如何處理我的複雜類。

我們來看下面的例子。我將把項目信息保存到Projects集合中,但我不想在項目文檔中保存項目團隊中的全名。我只是想將他們的EmployeeId保存在項目文檔中。我有一個單獨的員工集合,我想要保存個人/員工的具體信息。我的項目對象是這樣的:

public class Project 
{ 
    [JsonProperty(PropertyName="id")] 
    public int ProjectId {get; set;} 

    [JsonProperty(PropertyName="projectName")] 
    public string ProjectName {get; set;} 

    [JsonProperty(PropertyName="projectType")] 
    public string ProjectType {get; set;} 

    [JsonProperty(PropertyName="projectTeam")] 
    public List<TeamMember> ProjectTeam {get; set} 
} 

我TeamMember類從Employee對象繼承,看起來像這樣:

public class TeamMember : Employee 
{ 
    [JsonProperty(PropertyName="position")] 
    public string Position {get; set;} 
} 

我Employee類看起來是這樣的:

public class Employee 
{ 
    [JsonProperty(PropertyName="id")] 
    public int EmployeeId {get; set;} 

    [JsonProperty(PropertyName="firstName")] 
    public string FirstName {get; set;} 

    [JsonProperty(PropertyName="lastName")] 
    public string LastName {get; set;} 

    [JsonProperty(PropertyName="gender")] 
    public string Gender {get; set;} 

    [JsonProperty(PropertyName="emailAddress")] 
    public string EmailAddress {get; set;} 
} 

保存到之前項目集合,這裏是我的項目文檔應該是什麼樣子的例子:

{ 
    id: 12345, 
    projectName: "My first project", 
    projectType: "Construction Project", 
    projectTeam: [ 
     { id: 7777, position: "Engineer" }, 
     { id: 8998, position: "Project Manager" } 
    ] 
} 

如您所見,我將我的項目信息與員工數據分離,以分別將其存儲在他們自己的集合,項目和員工集合中。

讓我們不瞭解爲什麼我應該或不應該分離數據。我只想看看我應該如何以及在哪裏處理解耦以產生最快的結果。我想遵循最佳實踐,所以我只想看看使用DocumentDb的專家如何處理這種情況。

我能想到的兩個地方來處理這一點,但我想知道是否有這樣做更好,更直接的方式:

  1. 我可以在我的項目類轉換成JSON對象我的C#代碼中並將JSON對象傳遞給DocumentDb進行存儲。
  2. 或者,我可以將我的Project對象直接傳遞給DocumentDb,存入JavaScript存儲過程,並且可以處理DocumentDb中兩個或多個集合中的解耦和存儲數據。

這裏想什麼,我知道:

  1. 這是處理解耦數據在正確的地方?
  2. 哪個會提供更好的性能?
  3. 有沒有更好的方法來處理這個問題?我一直在閱讀有關如何將POCO類傳遞給DocumentDb的知識,它只是爲我處理它們。 DocumentDb會處理這些更復雜的場景嗎?如果是這樣,怎麼樣?

我感謝您的幫助。謝謝。

回答

7

在這樣的NoSql存儲中,可以在同一個集合中存儲具有不同模式的不同類型的文檔。

請不要將收藏品視爲表格。將收集看作是執行查詢,交易等的分區和邊界的單位。

因此,考慮到這一點,將您的項目文檔存儲爲所示並將僱員文檔包含在同一個集合中沒有任何問題。

現在說這一切;如果你仍然想這樣做,那麼你可以... 爲了實現這一點,你的項目對象將不得不改變。 而不必TeamMember:僱員(其中包括整個Employee對象)有TeamMember對象模仿你從你的JSON想要什麼......即

class TeamMember 
{ 
    int id {get;set;} 
    string position {get;set;} 
} 

現在,當DocumentDB序列化項目的對象,你最終會類似於你想要的JSON。然後你可以單獨保存你的Employee對象到別的地方。

如果你不想這樣做,或者不能這樣做,因爲你不控制模型的定義,或者因爲系統的其他部分已經建成依賴於此,那麼你可以調查建築一個爲你的Project對象定製的JSON轉換器,它會吐出你想要的JSON。 然後使用該JsonConverter裝飾您的Project對象,當DocumentDB進行轉換時,每次都會創建正確的結果。

+2

瑞恩,你是對的!我把收藏當作桌子。如果我將兩個項目和員工都存儲在同一個集合中,我將如何確定要查詢的文檔類型? – Sam 2014-09-11 22:36:06

+1

今天做到這一點的最簡單方法是爲每個JSON文檔添加一個「type」屬性並將其包含在查詢中。 WHERE type = project或WHERE type = employee 我知道你現在只限於WHERE中的3個子句,但是現在可能會在任何一天更改以允許更多。 我們很樂意聽到其他方式可以讓你更輕鬆,所以請保留反饋意見。 – 2014-09-12 23:33:23

+0

再次感謝瑞恩 – Sam 2014-09-13 00:02:14

相關問題