Отношения с mongoid, что я должен использовать? - PullRequest
1 голос
/ 24 ноября 2011

Я использую Ruby on Rails 3.1 с mongoid и пытаюсь установить довольно простые отношения между постами, комментариями, пользователями и тегами. Я очень новичок в mongodb, и вообще не знаю sql, поэтому я немного растерялся.

То, что я пытаюсь сделать, это: Пользователи, посты и комментарии должны иметь несколько тегов. Теги должны иметь имя, тип и счетчик того, сколько раз оно использовалось. Мне нужно иметь возможность получить все доступные теги, чтобы пользователи могли выбирать из них. И наоборот, иметь возможность получать теги от пользователей, сообщений и комментариев.

Я много об этом читал, и до сих пор не могу понять, какой подход мне выбрать. Должен ли я использовать ссылочные или встроенные отношения? Я посмотрел на пару драгоценных камней, но никто не работает, как я описал выше.

Sidenote: Я собираюсь использовать Tire для своей функции поиска позже.

1 Ответ

7 голосов
/ 26 ноября 2011

Круто, добро пожаловать в MongoDB! Это сложно понять и зависит от вашего приложения, но я постараюсь дать вам несколько советов, основанных на том, что вы написали, и что, я думаю, будет работать лучше.

Это не всегда так, но общая теория гласит, что если объектом всегда манипулируют и рассматривают в контексте другого, вы должны встроить его в этот объект. Это вероятно случай с комментариями и постами в вашем приложении. Поэтому вы можете встраивать комментарии в посты.

Однако, поскольку вы используете объект тега в нескольких контекстах, я бы сделал его собственной коллекцией, подобной этой:

class Tag
    include Mongoid::Document
    field :tag, type: String
    field :type, type: String
    field :count, type: Integer
end

Давайте отбросим ваши требования и создадим модели.

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

Выполнено с помощью вышеуказанного кода для класса тегов.

Пользователи, сообщения и комментарии должны иметь несколько тегов.

Хорошо, давайте дадим каждому из этих классов поле «теги», содержащее массив идентификаторов тегов, это будет ссылочное отношение.

class User
    include Mongoid::Document
    field :first_name, type: String
    field :last_name, type: String
    field :email, type: String
    field :tags, type: Array
end

Также здесь мы будем вставлять комментарии внутри постов вместе с массивом идентификаторов тегов, как мы делаем для пользователей.

class Post
    include Mongoid::Document
    field :subject, type: String
    field :body, type: String
    field :tags, type: Array
    embeds_many :comments
end

class Comment
    include Mongoid::Document
    field :name, type: String
    field :type, type: String
    field :count, type: Integer
    embedded_in :post
end

Имеет смысл? Здесь есть дополнительная информация здесь о моделировании такого рода отношений в Rails, но с использованием mongomapper вместо mongoid (поэтому не обращайте внимания на синтаксис, но обратите внимание на представленные идеи)

...