【发布时间】:2017-10-10 18:13:05
【问题描述】:
首先,我是 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"
}
]
}
]
}
球员和球队不会经常更换,因此(我认为)将它们存储在联盟文件中会很好。如果我要查询一个特定的联赛,我会得到所有球队和所有球员。如果我要查询特定团队怎么办?或者,如果我想获得特定球员所在的球队怎么办?我必须为每个团队/球员创建文档吗?
如果我要创建一个新的播放器文档会怎样?根据我的实际理解,我必须更新包含球员甚至联赛的球队。这是正确的方法吗?这对我来说似乎并不自然。如果是这样,我该怎么做?我尝试了存储过程或触发器。两者都很难实现(我的观点),因为我没有工具来测试和调试。触发器也将递归执行(创建球员导致更新球队,这导致更新联赛)。
如果这是要走的路,这里的最佳做法是什么?存储过程?触发器?是否有任何工具可以提高开发效率?
我还尝试通过 id 来引用联盟中的球队。这使得更新团队变得非常容易。不利的一面是,我需要多次调用才能获得特定联赛的所有球队,从而导致阅读时间更长。
谁能让我走上正轨?
【问题讨论】:
-
不幸的是,模式设计是一个相当广泛的话题,没有办法给你一个单一的、客观的答案。而且模式与触发器和存储过程无关。文档数据库不会阻止您参考其他文档。没有规定您必须嵌入其他文档,而不是引用其他文档。
标签: javascript azure azure-cosmosdb