Я запускаю проект MongoDB просто для удовольствия и как шанс изучить схемы MongoDB / NoSQL. Это будет приложение для живого чата, а в стек входят: Rails 3, Ruby 1.9.2, Devise, Mongoid / MongoDB, CarrierWave, Redis, JQuery.
Я буду обрабатывать опросы чатов / очереди сообщений отдельно. Пока не знаете, как это сделать: Node.js, APE или пользовательское приложение EventMachine. Но что касается Монго, я думаю использовать его для всего остального в приложении, в частности, для журналов чата и исторических записей.
Мой вопрос заключается в том, как лучше всего спроектировать схему, поскольку весь мой предыдущий опыт был с MySQL и схемами реляционных БД. И как подвопрос, когда нам лучше внедрить документы, чем связанные документы.
Приложение будет иметь:
- Несколько аккаунтов с несколькими комнатами
- Несколько номеров
- Несколько пользователей на номер
- Список номеров, в которых пользователю разрешено находиться
- Несколько пользовательских чатов на номер
- Доступные для поиска журналы чата для каждой комнаты и для каждого пользователя
- Дополнительное вложение файла для данного чата
Учитывая, что Mongo (по крайней мере, в прошлый раз, когда я проверял) имеет лимит документов 4 МБ, я не думаю, что иметь коллекцию для комнат и хранить все комнатные чаты, поскольку встроенные документы сработают так хорошо.
Из того, о чем я думал до сих пор, я думаю сделать что-то вроде:
- Коллекция для счетов
- Коллекция для комнат
- Каждая комната связана с учетной записью
- Связанные документы в коллекциях чатов для всех сообщений чата в комнате
- Встроенный документ со списком всех пользователей, находящихся в данный момент в комнате
- Коллекция для пользователей
- Встроенный документ, в котором перечислены все комнаты, в которых пользователь в данный момент находится
- Встроенный документ, в котором перечислены все комнаты, в которых может находиться пользователь
- Коллекция для чатов
- Каждый чат относится к комнате в коллекции комнат
- Каждый чат относится к пользователю в коллекции пользователей
- Встроенный документ с информацией о дополнительном вложенном загруженном файле.
Моя главная проблема в том, как далеко я зайду, пока это не станет похожим на реляционную схему, и я не одержу победу над целью? Определенно, здесь происходит нечто большее, чем встраивание.
Другая проблема заключается в том, что ссылки на связанные документы намного медленнее, чем доступ к встроенным документам, которые я слышал.
Я хочу сделать общие запросы, такие как:
- Дайте мне все комнаты для учетной записи
- Дайте мне все чаты в комнате (или отфильтрованные по диапазону дат)
- Дайте мне все чаты от определенного пользователя
- Дайте мне все загруженные файлы в данной комнате или для данной организации
- и т.д.
Есть предложения о том, как эффективно структурировать схему таким образом, чтобы она масштабировалась? Спасибо всем.