我有一个由PHP编写的基于Web的即时消息应用程序。最近我从mysql迁移到couchdb,我认为这通常是一个好主意,它到目前为止工作得很好。我不需要视图等。基本上我按ID获取文档。
但是我对性能有些怀疑。两个用户之间的对话存储在单个文档中。例如,在A和B之间,我有一个文档,在C和B之间我还有另一个文档等。
我从不删除日志,当这两个用户之间启动新会话时,我使用json_decode解码存储的文档,打印出用户最近的对话历史记录。当其中一个人写了新内容时,我在数组的末尾添加了新的聊天行(我从文档中获取),将数组重新编码为json,最后更新文档。
我对吗?在无sql数据库中存储这种大型数组的最佳实践是什么?
答案 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条消息,则将其拆分为两个数组:
"alice: Hi, Bob", and the next 149)
"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的技术更具可扩展性和正确性。