Использование MongoDB с Ruby On Rails и плагином Mongomapper - PullRequest
1 голос
/ 06 мая 2010

В настоящее время я пытаюсь изучать Ruby On Rails, поскольку я являюсь давним разработчиком PHP, поэтому я создаю свое собственное сообщество, такое как страница.

Я зашел довольно далеко и создал пользовательские модели и тому подобное, используя MySQL.

Но потом я услышал о MongoDB и заглянул к нему немного больше, и я нахожу это довольно приятным.

Итак, я настроил его и использую mongomapper для соединения между рельсами и MongoDB.

Я сейчас использую его для страницы новостей на сайте.

У меня также есть страница профиля для каждого пользователя, которая включает в себя собственную гостевую книгу, чтобы другие пользователи могли зайти в свой профиль и написать им небольшое сообщение.

Моя мысль сейчас состоит в том, чтобы изменить модели User с использования MySQL, чтобы начать использовать MongoDB.

Я могу начать с показа, как настраиваются модели для каждого пользователя.

Модель пользователя:

class User < ActiveRecord::Base
            has_one :guestbook, :class_name => "User::Guestbook"

Модель модели Гостевая книга:

class User::Guestbook < ActiveRecord::Base
  belongs_to :user
  has_many :posts, :class_name => "User::Guestbook::Posts", :foreign_key => "user_id"

А потом Гостевая книга публикует модель:

class User::Guestbook::Posts < ActiveRecord::Base
  belongs_to :guestbook, :class_name => "User::Guestbook"

Я разделил это так для собственного удобства, но сейчас, когда я собираюсь попытаться перейти на MongoDB, я не знаю, как составлять таблицы.

Я хотел бы иметь одну таблицу для каждого пользователя и в этой таблице «столбец» для всех записей гостевой книги, поскольку MongoDB может иметь EmbeddedDocument. Я хотел бы сделать это, поэтому у меня есть только одна таблица для каждого пользователя, и не так, как сейчас, когда у меня есть три таблицы, просто чтобы иметь гостевую книгу.

Итак, моя мысль такова:

Модель пользователя:

class User
  include MongoMapper::Document
  one :guestbook, :class_name => "User::Guestbook"

Модель Гостевая модель:

class User::Guestbook
  include MongoMapper::EmbeddedDocument
  belongs_to :user
  many :posts, :class_name => "User::Guestbook::Posts", :foreign_key => "user_id"

А потом Гостевая книга публикует модель:

class User::Guestbook::Posts
  include MongoMapper::EmbeddedDocument
  belongs_to :guestbook, :class_name => "User::Guestbook"

Но тогда я могу вспомнить одну проблему. Когда я просто хочу получить информацию о пользователе, такую ​​как псевдоним и дату рождения, тогда он должен будет извлечь все записи в гостевой книге пользователя. И если у каждого пользователя будет около тысячи сообщений в гостевой книге, он получит очень много информации для системы. Или я не прав?

Как вы думаете, я должен сделать это по-другому?

Ответы [ 2 ]

1 голос
/ 09 мая 2010

Нет, вам не нужно извлекать все записи в гостевой книге, если вы выбираете пользователя, это запрос Монго, и MongoMapper не должен работать так же по-другому (я сам использую Mongoid):

db.users.find({_id: '21314'}, {guestbook: 0})
                // instead of {guestbook: 1} which would return only the guestbook

Что следует знать, MongoDB все еще имеет ограничение в 4 МБ для одного документа, но это должно быть десятки тысяч записей в гостевой книге. С таким же успехом вы можете вставить старые в своего рода архив.

1 голос
/ 07 мая 2010

Если у вас будет тысячи записей в гостевой книге, возможно, было бы неплохо сделать эту коллекцию отдельной (именно по той причине, которую вы указали).

...