Как реализовать mongoid ассоциации «многие ко многим»? - PullRequest
10 голосов
/ 26 июля 2010

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

Ответы [ 4 ]

5 голосов
/ 30 августа 2010

Многим-многим следует избегать для масштабных приложений.Например, что делает Twitter, так это то, что он хранит идентификаторы подписчиков в разделенном запятыми формате (строку) внутри объекта пользователя.Использование MongoDB еще лучше, поскольку оно поддерживает массивы.

Помните, что лучше всего описывается NoSQL - это термин NoJoin;

4 голосов
/ 15 сентября 2010

Вы можете создавать (полиморфные) ассоциации «многие ко многим», используя реляционные ассоциации, и сохранять отношение в виде массива.

class Person
  include Mongoid::Document
  field :name
  references_many :preferences, :stored_as => :array, :inverse_of => :people
end

class Preference
  include Mongoid::Document
  field :name
  references_many :people, :stored_as => :array, :inverse_of => :preferences
end

ps1 = Person.create(:name => 'John Doe')
pf1 = Preference.create(:name => 'Preference A')
pf2 = Preference.create(:name => 'Preference B')

ps1.preferences << pf1
ps1.preferences << pf2
ps1.save

pf1.people.each {|ps| puts ps.name }
ps1.preferences.each {|pf| puts pf.name }

Подробнее о реляционных ассоциациях можно найти в документации Mongoid: http://mongoid.org/docs/associations/

Примечание. Ссылки, хранящиеся в виде массивов, могут медленно работать при массовом создании / обновлении объектов со многими связями. Более традиционная СУБД легко превзойдет Mongo, поскольку она добавит новую строку для каждого отношения, где mongo необходимо получить и обновить массив object_ids для самого объекта и для каждого отношения.

1 голос
/ 14 мая 2011

этот метод устарел.Теперь вы можете использовать reference_and_referenced_in_many следующим образом:

class Person
  include Mongoid::Document
  field :name
  references_and referenced_in_many :preferences
end

class Preference
  include Mongoid::Document
  field :name
  references_and referenced_in_many :people
end
0 голосов
/ 26 июля 2010

Вы не делаете много-много связей и объединяете таблицы с MongoDB.У каждого пользователя будет весь свой граф друзей, сохраненный в реальном пользовательском объекте, наряду со всем остальным, например, предпочтениями, изображениями (GridFS) и т. Д. Если вам нужно делать особые вещи, требующие реляционной алгебры, просто используйте RDBMS, иначе MongoDB будет работатьЧто ж.Можно выполнять сложные запросы, но вы должны использовать mapreduce.

...