首先,我是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"
}
]
}
]
}
球员和球队不会经常改变(我认为)将它们存储在联盟文件中会很好。如果我要查询特定联赛,我会得到所有球队和所有球员。如果我要查询特定团队怎么办?或者,如果我想让球队成为特定球员,该怎么办?我是否必须为每个团队/玩家创建文档?
如果我要创建新的播放器文档怎么办?从我的实际理解,我将不得不更新包含球员甚至联盟的球队。这是正确的方法吗?这对我来说似乎不太自然。如果是这样,我该怎么做?我尝试过存储过程或触发器。两者都很难实现(我的意见),因为我没有工具来测试和调试。触发器也将以递归方式执行(创建播放器导致更新团队,从而导致更新联盟)。
如果这是要走的路,这里的最佳做法是什么?存储过程?触发器?是否有任何工具可以提高开发效率?
我也尝试通过他们的身份引用联盟中的球队。这使得更新团队非常容易。不利的一面是,我会打几个电话让一个联盟的所有球队获得更高的阅读时间。
有人能让我走上正轨吗?
答案 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 Procedure
和Triggers
都是在天蓝色cosmos数据库端运行的JavaScript
。因此,您无法直接测试和调试它。
但是,Azure Cosmos DB SDK
提供getScriptLog
方法来获取console. Log ()
语句。因此,您可以添加console.log()
来调试JS代码。
我不确定您在后端使用哪种语言。
请参阅我回复的此主题以获取更多详细信息:Microsoft Azure CosmostDB Script Explorer console.log。
希望对您有所帮助。如有任何疑虑,请随时告诉我。