我对NoSQL完全不熟悉,所以我可能只是有一个基本的误解......
我浏览了this tutorial,了解如何使用Firebase制作聊天应用。例如,直接消息聊天的JSON如下所示:
{
"userMessages": {
"userid1": {
"userid2": {
"messageId1": {
"uid": "userid1",
"body": "Hello!",
"timestamp": firebase.database.ServerValue.TIMESTAMP
},
"messageId2": {
"uid": "userid2",
"body": "Hey!",
"timestamp": firebase.database.ServerValue.TIMESTAMP
}
}
}
}
}
请求邮件时,您需要查看userMessages / UserId1 / UserId2。这将在两个用户之间提供所有消息。
我决定使用DocumentDB尝试类似的东西,我不知道该怎么做。看起来我应该能够创建一个名为UserMessages的容器并将所有数据放在上面,但似乎DocumentDB只允许检索和更新顶级文档。因此,在这种情况下,我需要将所有内容都放在userid1下,并且每当我添加消息时,我都需要更新整个userid1文档,包括所有不包含所有消息的消息。改变。
我能看到这项工作的唯一方法就是压扁这个设计。但是展平应用程序的其余部分(包含许多更复杂的对象)似乎需要创建更多的容器(每个都要花钱)当我应该能够拥有更多分层设计并仅更新我需要的层或者仅推送需要推送的其他数据。
长话短说,我对NoSQL应该如何构建有一个根本的误解,或者DocumentDB与其他NoSQL解决方案有什么不同?谢谢!
答案 0 :(得分:6)
DocDB中的文档存储在集合中。集合可以包含任何类型(无模式)文档,并且是可计费单元。 (见Hierarchical model here)。
当你说你需要更新整个文档时,你是正确的,你不能做部分更新,所以在你的原始方法中,每次新消息到达时它都会变成一个较慢的过程。
但您可以为较小的文档重构设计,并仍然使用以下内容查询user1 / user2关系:
{
"type":"message",
"from":"userid1",
"to":"userid2",
"conversation":"userid1-userid2",
"body":"Hello!":
"timestamp":firebase.database.ServerValue.TIMESTAMP
}
{
"type":"message",
"from":"userid2",
"to":"userid1",
"conversation":"userid1-userid2",
"body":"Hey!":
"timestamp":firebase.database.ServerValue.TIMESTAMP
}
所以你实际上可以做两个不同的查询:
conversation
属性查询,user1和user2之间的对话是什么。from
和to
属性向user2发送了哪些消息(或者仅由user1发送)。您可以通过user1向使用from
的任何用户或仅使用to
收到的用户查询已发送的消息。如果您阅读how the internal indexes are managed,您可以看到所有属性都会自动编入索引,并且在您压缩数据时没有性能问题。
我不熟悉Firebase,如果应用程序期望第一种格式的信息(可能是创建一些翻译中间件的问题),您可能需要更改一些代码。
希望它有所帮助!