作者:关注前世男友 | 来源:互联网 | 2023-02-10 11:32
我是NoSQL的新手,所以我可能只是有一个基本的误解......
我阅读了本教程,讲授如何使用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解决方案有什么不同?谢谢!
1> Matias Quara..:
DocDB中的文档存储在集合中.集合可以包含任何类型(无模式)文档,并且是可计费单元.(请参阅此处的分层模型).
当你说你需要更新整个文档时,你是正确的DocDB,你不能做部分更新,所以在你的原始方法中,每当新消息到达时它将变成一个较慢的过程.
但您可以为较小的文档重构设计,并仍然使用以下内容查询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之间的对话是什么.
user1向user2发送了哪些消息(或者只是user1发送的)带有from
和to
属性.您可以通过user1向任何使用from
过的用户或仅使用过的用户查询已发送的消息to
.
如果您阅读了如何管理内部索引,您可以看到所有属性都自动编入索引,并且当您像这样展平数据时没有性能问题.
我不熟悉Firebase,如果应用程序期望第一种格式的信息(可能是创建一些翻译中间件的问题),您可能需要更改一些代码.
希望能帮助到你!