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