在 Azure Cosmos 中正确存储数据

问题描述 投票:1回答:2

我有一个数据库,其中有两个 "容器",一个是 "用户",另一个是 "帖子"。

Users :

{
   id: 1,
   name: "Peter"
},
{
   id: 2,
   name: "Paul"
}

帖子。

{
    id: 1,
    title: "My First post"
    authorId : 1
},
{
    id: 2,
    title: "My Second post"
    authorId : 1
}

如果一个用户想喜欢一个帖子,那么用户2喜欢帖子1,那么这个数据库应该保存在哪里?是否应该更新 "帖子 "项,将谁喜欢的帖子保存在一个数组中?如果是这样的话,当有几百万人喜欢这个帖子的时候会怎么样?

{
    id: 1,
    title: "My First post"
    authorId : 1,
    usersWhoLikeThis: [2,130,2341]
},

这些数据是否应该保存在用户的详细信息中,例如。

{
   id: 2,
   name: "Paul",
   postsILike: [1,15,82,800]
}

还是应该把这些信息储存在自己的容器里?

Like. Like:

{
   id: 1,
   userId: 2,
   postId: 1
},
{
   id: 2,
   userId: 2,
   postId: 2
}

但这意味着我必须查询该数据库两次,一次获取帖子列表,第二次查询获取用户的赞数列表,并使用两个数据集,检查 "赞 "数据集与每个postId是否存在。

有没有人有什么技巧或例子来说明如何以最好的方式存储这样的数据?

衷心感谢

database-design nosql azure-cosmosdb
2个回答
0
投票

我将把post和like建模为一个单一的容器,以postid作为分区键,然后使用 "type "属性来区分 "post "和 "like"。每一个新的帖子都是一个插入,每一个喜欢都是一个插入。像 "Select * from c where c.postid = "xxx "这样的查询会返回原始帖子加上喜欢的数组。

根据你的情况,你也可以建立这样的模型,"post "项目包含一个 "likes "属性,它是每个喜欢的计数,在每次从Change Feed插入时递增。这完全取决于你的应用如何工作。

例如,如果人们滚动帖子,并且可以在点击之前看到喜欢的总数量,那么你可能想在每个新的喜欢上递增,并且更新每个帖子。那么你对feed页面的查询将是 "select * from c where c.type = 'post'"。请注意,在下面的模型中,这将是一个跨部分查询。同样,你会寻找使用Change Feed有可能把数据放到一个单独的容器中,这个容器有一个分区键,可以轻松地回答单分区查询。

简而言之,我是这样建模的。

帖子容器

{
    id: "xxxxx",
    postId: "abcdef"
    title: "My First post"
    likes: 2,
    userId : "aaaa",
    type: "post"
},
{
    id: "xxxxx",
    postId: "abcdef"
    userId : "bbbb",
    type: "like"
},
{
    id: "xxxxx",
    postId: "abcdef"
    userId : "cccc",
    type: "like"
},

我会把作者泛化为用户,放在同一个容器里。

我们有一个在大同数据库上建立博客引擎的例子。这和你想做的事情非常相似。请看。如何使用实际案例在 Azure Cosmos DB 上对数据进行建模和分区?

希望对大家有所帮助。


0
投票

我想说的是,重 取决于你想如何读写 的数据。你的帖子可能首先只需要显示点赞数,想要防止用户对一篇帖子点赞超过一次。

所以你可以把赞数存储在用户内部,确保它只能对一篇文章点赞一次。然后你可以使用存储过程或者改变feed来更新帖子的点赞数。

但是,如果你的读写用例不同,数据库设计可能也会变...

阅读更多关于:Azure Cosmos DB 中的数据建模

© www.soinside.com 2019 - 2024. All rights reserved.