Подтвердить что ты не робот

Как реализовать мангоидные ассоциации "многие-ко-многим"?

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

4b9b3361

Ответ 1

этот метод устарел. теперь вы можете использовать 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

Ответ 2

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

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

Ответ 3

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

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/

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

Ответ 4

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