在 Azure Cosmos 中正确存储数据
Storing data correctly in Azure Cosmos
我有一个数据库有两个 "Containers" 一个用于 "Users" 另一个用于 "Posts":
用户:
{
id: 1,
name: "Peter"
},
{
id: 2,
name: "Paul"
}
Posts:
{
id: 1,
title: "My First post"
authorId : 1
},
{
id: 2,
title: "My Second post"
authorId : 1
}
如果一个用户想点赞一个post,那么用户2点赞了一个post,那个数据库应该保存在哪里?是否应该更新 Post 项以在数组中保留谁喜欢 post 的引用?如果是这样,当数百万人喜欢这样时会发生什么 post?
{
id: 1,
title: "My First post"
authorId : 1,
usersWhoLikeThis: [2,130,2341]
},
是否应将数据存储在用户详细信息中,例如:
{
id: 2,
name: "Paul",
postsILike: [1,15,82,800]
}
或者应该将此信息存储在其自己的容器中:
赞数:
{
id: 1,
userId: 2,
postId: 1
},
{
id: 2,
userId: 2,
postId: 2
}
但这意味着我必须查询该数据库两次,一次是获取 post 的列表,然后是第二次查询以获取用户的喜欢列表并使用两个数据集并针对每个 postId 检查 'likes' 数据集,看看它是否存在。
有没有人有关于像这样存储数据的最佳方式的任何提示或示例?
非常感谢
我会说这很重要取决于您希望如何读取/写入数据。您的 post 可能只需要首先显示点赞数,并希望防止用户对 post 点赞不止一次。
因此您可以将点赞存储在用户内部,以确保它只能对 post 点赞一次。然后,您可以使用存储过程或更改提要来更新 post 上的点赞数。
但是,如果您的读/写用例不同,数据库设计可能也会发生变化...
阅读更多关于:
Data modeling in Azure Cosmos DB
我会将 post 和 likes 建模为单个容器,以 postid 作为分区键,然后使用 "type" 属性 来区分 "post" 来自 "like"。每个新 post 都是插入,每个喜欢都是插入。一个查询如"Select * from c where c.postid = "xxx" returns 原来post 加上点赞的数组。
根据您的情况,您还可以对此进行建模,使 "post" 项目包含一个 "likes" 属性,它是每个类似的计数,在每次从 Change 插入时递增喂养。这完全取决于您的应用程序的工作方式。
例如,如果人们滚动 posts 并且可以在点击它们之前看到喜欢的总数,那么您可能希望增加每个新的喜欢并更新每个 post .那么您对提要页面的查询将是 "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"
},
我会将作者概括为只是用户并放在同一个容器中。
我们有一个在 Cosmos DB 之上构建博客引擎的示例实现。这与您正在尝试做的非常相似。请看,How to model and partition data on Azure Cosmos DB using a real-world example
希望对您有所帮助。
我有一个数据库有两个 "Containers" 一个用于 "Users" 另一个用于 "Posts":
用户:
{
id: 1,
name: "Peter"
},
{
id: 2,
name: "Paul"
}
Posts:
{
id: 1,
title: "My First post"
authorId : 1
},
{
id: 2,
title: "My Second post"
authorId : 1
}
如果一个用户想点赞一个post,那么用户2点赞了一个post,那个数据库应该保存在哪里?是否应该更新 Post 项以在数组中保留谁喜欢 post 的引用?如果是这样,当数百万人喜欢这样时会发生什么 post?
{
id: 1,
title: "My First post"
authorId : 1,
usersWhoLikeThis: [2,130,2341]
},
是否应将数据存储在用户详细信息中,例如:
{
id: 2,
name: "Paul",
postsILike: [1,15,82,800]
}
或者应该将此信息存储在其自己的容器中:
赞数:
{
id: 1,
userId: 2,
postId: 1
},
{
id: 2,
userId: 2,
postId: 2
}
但这意味着我必须查询该数据库两次,一次是获取 post 的列表,然后是第二次查询以获取用户的喜欢列表并使用两个数据集并针对每个 postId 检查 'likes' 数据集,看看它是否存在。
有没有人有关于像这样存储数据的最佳方式的任何提示或示例?
非常感谢
我会说这很重要取决于您希望如何读取/写入数据。您的 post 可能只需要首先显示点赞数,并希望防止用户对 post 点赞不止一次。
因此您可以将点赞存储在用户内部,以确保它只能对 post 点赞一次。然后,您可以使用存储过程或更改提要来更新 post 上的点赞数。
但是,如果您的读/写用例不同,数据库设计可能也会发生变化...
阅读更多关于: Data modeling in Azure Cosmos DB
我会将 post 和 likes 建模为单个容器,以 postid 作为分区键,然后使用 "type" 属性 来区分 "post" 来自 "like"。每个新 post 都是插入,每个喜欢都是插入。一个查询如"Select * from c where c.postid = "xxx" returns 原来post 加上点赞的数组。
根据您的情况,您还可以对此进行建模,使 "post" 项目包含一个 "likes" 属性,它是每个类似的计数,在每次从 Change 插入时递增喂养。这完全取决于您的应用程序的工作方式。
例如,如果人们滚动 posts 并且可以在点击它们之前看到喜欢的总数,那么您可能希望增加每个新的喜欢并更新每个 post .那么您对提要页面的查询将是 "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"
},
我会将作者概括为只是用户并放在同一个容器中。
我们有一个在 Cosmos DB 之上构建博客引擎的示例实现。这与您正在尝试做的非常相似。请看,How to model and partition data on Azure Cosmos DB using a real-world example
希望对您有所帮助。