我应该将帖子和评论作为不同的收藏吗?

时间:2018-02-14 14:14:49

标签: azure-cosmosdb

我正在阅读以下文档about Cosmos DB

在本文档中,他们有以下帖子

{
    "id":"ew12-res2-234e-544f",
    "title":"post title",
    "date":"2016-01-01",
    "body":"this is an awesome post stored on NoSQL",
    "createdBy":User,
    "images":["http://myfirstimage.png","http://mysecondimage.png"],
    "videos":[
        {"url":"http://myfirstvideo.mp4", "title":"The first video"},
        {"url":"http://mysecondvideo.mp4", "title":"The second video"}
    ],
    "audios":[
        {"url":"http://myfirstaudio.mp3", "title":"The first audio"},
        {"url":"http://mysecondaudio.mp3", "title":"The second audio"}
    ]
}

他们说以下评论可能只是另一篇有父母属性的帖子

{
    "id":"1234-asd3-54ts-199a",
    "title":"Awesome post!",
    "date":"2016-01-02",
    "createdBy":User2,
    "parent":"ew12-res2-234e-544f"
}

{
    "id":"asd2-fee4-23gc-jh67",
    "title":"Ditto!",
    "date":"2016-01-03",
    "createdBy":User3,
    "parent":"ew12-res2-234e-544f"
}

这是否意味着我将两种文档类型存储在同一个集合中,或者我应该有两个集合,每个文档类型一个?

我知道我可以将它们存储在同一个集合中,我的问题是什么是最好的方法,因为文档不清楚。

2 个答案:

答案 0 :(得分:0)

与往常一样有这些问题:这取决于。

将多种文档类型放入单个集合中绝对不是一种“不好的做法”,尽管您可能希望在文档中添加“类型”参数或类似参数,以便更轻松地过滤它们。

您每次收取固定费用(取决于RU / s)。因此,如果您提供了许多集合,最终可能会付出太多代价。如果您的数据共享一个公共域,在大多数情况下,较少的集合可能更好。 它还高度取决于您(通常)想要读取和写入数据的方式。主要是关于如何查询数据。找到好的partition key也可能会影响您的决定。

答案 1 :(得分:-1)

这实际上是设计和偏好的问题,不确定它是否属于StackOverflow的On-Topic指南的编码答案。

那篇文章提出了一种组织帖子和评论的方法,因为从概念上讲两者非常相似,它们可能是相同的“事物”。但是您可以将它们分成不同的文档类型并将它们存储在不同的集合中,这实际上取决于您希望如何查询信息以及如何将查询功能公开给架构中的其他服务。 Here是我们的PM之一的非常好的建筑答案。

关于利弊:

如果您将两种对象类型都存储在相同的集合中,您只需要维护一个DocumentClient并且可以使用相同的方式来查询评论和帖子,他们会共享配置集合涉及索引,分区和配置的RU。这可能是最具成本效益的选择。

如果您将它们单独存储,则需要维护多个DocumentClient,但您可以为每个设置不同的RU(如果由于某种原因您希望提供更多的RU来发布而不是评论)如果你想,保持不同的分区策略。