couchdb - json在Messenger应用程序中的性能

时间:2011-09-19 14:09:26

标签: json couchdb

我有一个由PHP编写的基于Web的即时消息应用程序。最近我从mysql迁移到couchdb,我认为这通常是一个好主意,它到目前为止工作得很好。我不需要视图等。基本上我按ID获取文档。

但是我对性能有些怀疑。两个用户之间的对话存储在单个文档中。例如,在A和B之间,我有一个文档,在C和B之间我还有另一个文档等。

我从不删除日志,当这两个用户之间启动新会话时,我使用json_decode解码存储的文档,打印出用户最近的对话历史记录。当其中一个人写了新内容时,我在数组的末尾添加了新的聊天行(我从文档中获取),将数组重新编码为json,最后更新文档。

我对吗?在无sql数据库中存储这种大型数组的最佳实践是什么?

2 个答案:

答案 0 :(得分:7)

我的模型不同;说出每件事都用一份文件。 {“from”:“foo”,“to”:“bar”,“text”:“嘿那里”}。因此,您只需制作新文档,并且每个文档都保持很小。

添加时间戳,然后使用在该时间戳上键入的视图重建对话。

您需要使用服务器的时间来确保正确的排序,因此我建议您通过更新处理程序(http://wiki.apache.org/couchdb/Document_Update_Handlers)进行更新,并在其中添加时间戳。

答案 1 :(得分:1)

解决方法是偶尔将旧邮件捆绑到CouchDB attachments。按文档ID查询时,这些内容将不可见。

例如,对话文档:

{ "_id": "alice_bob"
, "_rev": "123-abcdef"
, "messages":
  [ "alice: Hi, Bob!"
  , "alice: Are you there?"
  , "bob: Yes, what's up?"
  , // ... etc.
  , "bob: Thanks!"
  ]
}

例如,如果会话长度大于200条消息,则将其拆分为两个数组:

  • 最早的150条消息("alice: Hi, Bob", and the next 149)
  • 50条最新消息:( 49条消息,包括"bob: Thanks!"

将旧邮件存档在附件中,可能带有时间戳。

{ "_id": "alice_bob"
, "_rev": "123-abcdef"
, "_attachments":
  { "2011-09-19T17:29:17.293Z.json":
    { "content_type": "application/json"
    , "data": /* 150 message JSON string goes here */
    }
  }
, "messages": [ /* latest 50 messages go here */ ]
}

当您获取/db/alice_bob时,您将 获取附件数据;但是,您可以直接从此URL获取甚至删除附件。

/db/alice_bob/2011-09-19T17:29:17.293Z.json

注意,这主要是解决方法。优点是您根本不必更改PHP代码。 (归档消息可以是后台进程。)但从长远来看,Robert的技术更具可扩展性和正确性。