2017-03-02 87 views
0

我完全新的NoSQL的,所以我可能只是有一个基本的误解......如何构建一个DocumentDB数据库

我通过this tutorial去教导如何使用火力地堡做一个聊天应用。举个例子,对于私信聊天的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解决方案?谢谢!

回答

6

在DocDB文档存储在集合。集合可以包含任何类型(无模式)的文档,并且是可计费的单元。 (见Hierarchical model here)。

当你说你需要更新整个文档,你不能进行部分更新时,你对DocDB是正确的,所以在你原来的方法中,每当新的消息到达时它会变成一个较慢的过程。

但是你可以重构设计较小的文件,仍然查询的东西,如用户1 /用户2的关系:

{ 
    "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 
} 

所以你实际上可以做2个不同的查询:

  • 什么通过查询conversation属性,可以在user1和user2之间进行会话。
  • 哪个消息是由用户1与fromto属性发送给用户2(或仅由用户1发送)。您可以查询user1发送的邮件给任何使用from的用户,也可以仅使用to收到的邮件。

如果你读how the internal indexes are managed你可以看到,所有的属性将自动索引,还有就是当你压扁这样的数据没有性能问题。

我不熟悉的火力地堡,您可能需要改变一些代码,如果应用程序期待第一格式的信息(也许是创造了一些翻译中间件的问题)。

希望它有帮助!