2017-03-02 38 views
0

我完全新的NoSQL的,所以我可能只是有一個基本的誤解......如何構建一個DocumentDB數據庫

我通過this tutorial去教導如何使用火力地堡做一個聊天應用。舉個例子,對於私信聊天的JSON是這樣的:

{ 
    "userMessages": { 
    "userid1": { 
     "userid2": { 
     "messageId1": { 
      "uid": "userid1", 
      "body": "Hello!", 
      "timestamp": firebase.database.ServerValue.TIMESTAMP 
     }, 
     "messageId2": { 
      "uid": "userid2", 
      "body": "Hey!", 
      "timestamp": firebase.database.ServerValue.TIMESTAMP 
     } 
     } 
    } 
    } 
} 

請求消息時,你就看着userMessages/UserId1/UserId2。這將給出兩個用戶之間的所有消息。

我決定嘗試使用DocumentDB類似的東西,我不知道該怎麼做。看起來我應該能夠創建一個名爲UserMessages的容器,並將所有數據放在上面,但似乎DocumentDB只允許檢索和更新頂級文檔。因此,在這種情況下,我需要將所有內容都放在userid1下,隨時添加一條消息,我需要更新整個userid1文檔,包括所有未更改的消息。

我可以看到使這項工作的唯一辦法就是擊敗這個設計。但是,將應用程序的其餘部分展開(有許多更復雜的對象)似乎需要創建更多的容器(每個都需要花費金錢),當我應該能夠擁有更多分層設計並僅更新我需要的圖層或更新時只推送需要推送的附加數據。

長話短說,我有NoSQL的應該如何構建一個根本性的誤解,或者是DocumentDB只是讓區別於其它的NoSQL解決方案?謝謝!

回答

6

在DocDB文檔存儲在集合。集合可以包含任何類型(無模式)的文檔,並且是可計費的單元。 (見Hierarchical model here)。

當你說你需要更新整個文檔,你不能進行部分更新時,你對DocDB是正確的,所以在你原來的方法中,每當新的消息到達時它會變成一個較慢的過程。

但是你可以重構設計較小的文件,仍然查詢的東西,如用戶1 /用戶2的關係:

{ 
    "type":"message", 
    "from":"userid1", 
    "to":"userid2", 
    "conversation":"userid1-userid2", 
    "body":"Hello!": 
    "timestamp":firebase.database.ServerValue.TIMESTAMP 
} 

{ 
    "type":"message", 
    "from":"userid2", 
    "to":"userid1", 
    "conversation":"userid1-userid2", 
    "body":"Hey!": 
    "timestamp":firebase.database.ServerValue.TIMESTAMP 
} 

所以你實際上可以做2個不同的查詢:

  • 什麼通過查詢conversation屬性,可以在user1和user2之間進行會話。
  • 哪個消息是由用戶1與fromto屬性發送給用戶2(或僅由用戶1發送)。您可以查詢user1發送的郵件給任何使用from的用戶,也可以僅使用to收到的郵件。

如果你讀how the internal indexes are managed你可以看到,所有的屬性將自動索引,還有就是當你壓扁這樣的數據沒有性能問題。

我不熟悉的火力地堡,您可能需要改變一些代碼,如果應用程序期待第一格式的信息(也許是創造了一些翻譯中間件的問題)。

希望它有幫助!

相關問題