【发布时间】:2018-12-19 14:09:27
【问题描述】:
我在 cosmos 的同一个集合中有两组数据,一组是“帖子”,另一组是“用户”,它们由用户创建的帖子链接。
目前我的结构如下;
// user document
{
id: 123,
postIds: ['id1','id2']
}
// post document
{
id: 'id1',
ownerId: 123
}
{
id: 'id2',
ownerId: 123
}
我对这个设置的主要问题是它的可替代性,代码必须强制链接,如果有错误数据很容易丢失,并且没有明确的恢复方法。
我还关心性能,如果用户有 10,000 条帖子,那么我将不得不做 10,000 次查找来解决所有帖子..
这是对实体关系建模的正确方法吗?
【问题讨论】:
-
您正在尝试以一种不适合使用的方式使用 Cosmos DB。 CosmosDB 不是关系数据库,在对象建模方面没有任何限制。您应该以永远不必执行跨分区查询的方式设计您的 Cosmos 集合。目前的设计看起来需要这样。
-
那么所有的帖子对象都会直接存在于用户身上吗?但是,如果我想显示每个人发布的所有帖子,我就必须查询每个用户并从中获取帖子?
-
但是,如果帖子可以被任何用户“点赞”,那又是如何建模的呢?投票用户的 id 将存储在所有者用户内部的帖子中吗?然后为了获得用户的所有喜欢,必须查询用户......这应该是如何工作的?
-
这取决于您的分区策略以及对谁可以修改您的数据库的严格要求。我会写一个详细的答案。
-
@NickChapsas - 这里真的没有“正确”的答案。有很多方法可以对这些数据进行建模,每种方法都有优点和缺点。有一些选项可以将规范化(关系)ids(带数组?)与非规范化数据混合以快速显示(例如,嵌入用户文档中的最新帖子的 sn-p,带有/id+简短描述的子文档数组?)。存储“喜欢”也是如此。而且我们没有关于如何使用/显示这些数据、读取和写入繁重的工作负载等方面的信息。这是一个非常棒的讨论,但是......它并不适合这里,因为它的性质非常广泛。
标签: azure azure-cosmosdb