2017-10-10 144 views
-1

首先,我是CosmosDB(NoSQL)的新手,目前只使用SQL-Server。我想遷移到CosmosDB,並且很難理解一些基本概念。我明白,一切都是文件,沒有連接,一切都是非規範化的,等等。如何處理天藍色宇宙中的參考資料db

比方說,我想創建一些體育聯盟的模型。我有球隊,球隊有球員,球隊在聯盟中。

{ 
"typename": "League", 
"id": "league.1", 
"teams": [ 
    { 
     "typename": "Team", 
     "id": "team.1", 
     "leagueId": "league.1", 
     "players": [ 
      { 
       "typename": "Player", 
       "id": "Player.1", 
       "teamId": "team.1", 
       "name": "John" 
      }, 
      { 
       "typename": "Player", 
       "id": "Player.1", 
       "teamId": "team.1", 
       "name": "Alex" 
      } 
     ] 
    } 
] 

}

的球員和球隊不經常改變,因此(我認爲)這將是罰款,並將其存儲聯賽文件內。如果我想問一個特定的聯盟,我會得到所有球隊和所有球員。如果我要查詢某個特定的團隊,該怎麼辦?或者如果我想讓一個特定的球員進入球隊呢?我是否必須爲每個團隊/球員創建文檔?

如果我要創建新的播放器文檔,該怎麼辦?根據我的實際理解,我必須更新包含球員乃至聯盟的球隊。這是正確的方法嗎?這對我來說似乎不太自然。如果是這樣,我將如何做到這一點?我試過存儲過程或觸發器。這兩者都很難實現(我的觀點),因爲我沒有工具來測試和調試。觸發器也將被遞歸執行(創建玩家導致更新團隊,這導致更新聯盟)。

如果這是要走的路,那麼這裏最好的做法是什麼?存儲過程?觸發器?有什麼工具可以提高開發效率嗎?

我也試過用他們的id來引用聯盟中的球隊。這使得更新團隊非常簡單。缺點是我會有幾次打電話讓所有聯盟的球隊獲得更高的閱讀時間。

有人能讓我走上正確的軌道嗎?

+0

不幸的是,模式設計是一個相當廣泛的話題,沒有辦法給你一個單一的客觀答案。模式與觸發器和存儲過程無關。文檔數據庫不排除您引用其他文檔。沒有規定說你必須嵌入相對引用和其他文檔。 –

回答

0

如果我要查詢特定團隊該怎麼辦?或者,如果我想要獲得某個特定球員所在的球隊 ?我需要爲每個球隊/球員創建 的文檔嗎?

不,您不必爲每個團隊或玩家創建文檔。 Azure cosmos DB(NoSQL)Document類型的數據庫。所以它是schema-less,可以是nested

我的建議是可以爲每個聯盟創建每個文檔。我認爲這種設計模式是最直觀,最適合您的需求的。

我試圖創建示例文件:

{ 
    "id": "1", 
    "name": "basketball", 
    "team": [ 
     { 
      "teamId": "11", 
      "name": "team1", 
      "player": [ 
       { 
        "playerId": "11A", 
        "playerName": "A" 
       }, 
       { 
        "playerId": "11B", 
        "playerName": "B" 
       } 
      ] 
     }, 
     { 
      "teamId": "22", 
      "name": "team2", 
      "player": [ 
       { 
        "playerId": "22C", 
        "playerName": "C" 
       }, 
       { 
        "playerId": "22D", 
        "playerName": "D" 
       } 
      ] 
     } 
    ] 
} 

如果我將創建一個新的播放器的文件?從我的實際 的理解,我將不得不更新包含球員 甚至聯盟的球隊。

看來你想更新文件的部分不whole.Per我的經驗,天藍色宇宙db doesn't support部分更新了。

但是,Azure Cosmos DB支持MongoDB protocol。您可以在Azure official page上確認。

請參閱此link

我試過存儲過程或觸發器。兩者都相當困難 實施(我的意見),因爲我沒有工具來測試和調試。

兩個Stored ProcedureTriggers都在蔚藍宇宙DB服務器side.So運行的所有JavaScript,你不能直接測試和調試。

但是,Azure Cosmos DB SDK提供了getScriptLog方法來獲取console. Log()語句。所以,你可以添加console.log()來調試你的JS代碼。

我不確定您在後端使用哪種語言。

請參閱此主題,我回復了更多詳情:Microsoft Azure CosmostDB Script Explorer console.log

希望它可以幫助你。如有任何問題,請隨時告訴我。

+0

真的沒有正確的答案。 OP的數據組織將取決於他們的應用程序以及他們如何查詢它。你正在提出一個單一的「聯賽」文件,每個球隊和每個球員都會使得操縱單個球員變得很困難(或代價昂貴)。而且你正在引入數組的數組(同樣,查詢複雜化)。 –

+0

我的理解是,CosmosDB提供快速讀取,代價是更新緩慢(或創建),這對我來說是完全正確的。我的期望是,api請求被寫入95%,寫入5%。 @Jay感謝您使用MongoDB的建議。我會試一試。 – user3838018

+0

@ user3838018行!你也可以注意到使用console.log()來調試你的SP或Trigger。 –