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