如何处理azure cosmos db中的引用

时间:2017-10-10 18:13:06

标签: javascript azure azure-cosmosdb

首先,我是CosmosDB(NoSQL)的新手,到目前为止只使用过SQL-Server。我想迁移到CosmosDB并且很难理解一些基本概念。我知道一切都是文档,没有连接,一切都是非规范化的等等。

假设我想为一些体育联盟创建一个模型。我有球队,球队有球员,球队都在联盟中。

{
"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"
            }
        ]
    }
]

}

球员和球队不会经常改变(我认为)将它们存储在联盟文件中会很好。如果我要查询特定联赛,我会得到所有球队和所有球员。如果我要查询特定团队怎么办?或者,如果我想让球队成为特定球员,该怎么办?我是否必须为每个团队/玩家创建文档?

如果我要创建新的播放器文档怎么办?从我的实际理解,我将不得不更新包含球员甚至联盟的球队。这是正确的方法吗?这对我来说似乎不太自然。如果是这样,我该怎么做?我尝试过存储过程或触发器。两者都很难实现(我的意见),因为我没有工具来测试和调试。触发器也将以递归方式执行(创建播放器导致更新团队,从而导致更新联盟)。

如果这是要走的路,这里的最佳做法是什么?存储过程?触发器?是否有任何工具可以提高开发效率?

我也尝试通过他们的身份引用联盟中的球队。这使得更新团队非常容易。不利的一面是,我会打几个电话让一个联盟的所有球队获得更高的阅读时间。

有人能让我走上正轨吗?

1 个答案:

答案 0 :(得分:0)

  

如果我要查询特定团队怎么办?或者,如果我想得到什么   特定球员所在的球队?我是否必须为其创建文档   每个队/球员?

不,您不必为每个团队或玩家创建文档。 Azure cosmos DB(NoSQL)Document类型数据库。所以它是schema-less,可以是nested

我的建议是你可以为每个联盟创建每个文档。我认为这种设计模式最直观,最适合你的需求。

我尝试创建示例league文档:

{
    "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"
                }
            ]
        }
    ]
}
  

如果我要创建新的播放器文档怎么办?从我的实际   理解我必须更新包含播放器的团队   甚至联盟。

似乎你想要更新文件的部分而不是整个。根据我的经验,azure cosmos db doesn't support现在部分更新。

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

请参阅此link

  

我尝试过存储过程或触发器。两者都相当难   实现(我的意见)因为我没有工具来测试和调试。

Stored ProcedureTriggers都是在天蓝色cosmos数据库端运行的JavaScript。因此,您无法直接测试和调试它。

但是,Azure Cosmos DB SDK提供getScriptLog方法来获取console. Log ()语句。因此,您可以添加console.log()来调试JS代码。

我不确定您在后端使用哪种语言。

请参阅我回复的此主题以获取更多详细信息:Microsoft Azure CosmostDB Script Explorer console.log

希望对您有所帮助。如有任何疑虑,请随时告诉我。