我开始一个 MongoDB 项目只是为了好玩,并作为学习 MongoDB/NoSQL 模式的机会。这将是一个实时聊天应用程序,堆栈包括:Rails 3、Ruby 1.9.2、Devise、Mongoid/MongoDB、CarrierWave、Redis、JQuery。
我将分别处理实时聊天轮询/消息队列。不确定如何使用 Node.js、APE 或自定义 EventMachine 应用程序。但是关于 Mongo,我正在考虑将它用于应用程序中的所有其他内容,特别是聊天日志和历史记录。
我的问题是如何最好地设计模式,因为我之前的所有经验都是使用 MySQL 和关系数据库模式。作为一个子问题,什么时候最适合我们嵌入文档和相关文档。
该应用程序将具有:
- 拥有多个房间的多个帐户
- 多个房间
- 每个房间有多个用户
- 允许用户进入的房间列表
- 每个房间有多个用户聊天
- 每个房间和每个用户的可搜索聊天日志
- 给定聊天的可选文件附件
鉴于 Mongo(至少我上次检查时)的文档限制为 4MB,我不认为拥有房间集合并将所有房间聊天存储为嵌入式文档会很好。
从我到目前为止的想法来看,我正在考虑做类似的事情:
- 帐户集合
- 房间系列
- 每个房间都与一个帐户相关联
- 聊天室中所有聊天消息的聊天集合中的相关文档
- 列出当前在房间内的所有用户的嵌入式文档
- 用户集合
- 列出用户当前所在的所有房间的嵌入式文档
- 列出用户被允许进入的所有房间的嵌入式文档
- 聊天合集
- 每个聊天都与房间集合中的一个房间相关联
- 每个聊天都与用户集合中的用户相关
- 包含可选上传文件附件信息的嵌入式文档。
我主要关心的是我要走多远,直到这最终看起来像一个关系模式并且我打败了目的?肯定比嵌入更多相关。
另一个问题是引用相关文档比访问我听说过的嵌入文档要慢得多。
我想进行通用查询,例如:
- 给我所有房间的帐户
- 给我一个房间里的所有聊天(或按日期范围过滤)
- 给我来自特定用户的所有聊天记录
- 给我一个给定房间或给定组织的所有上传文件
- ETC
关于如何以可扩展的方式有效地构建模式的任何建议?感谢大家。