Я хочу перенести социальную сеть на Mongoid. Таблица соединений между друзьями очень велика. Есть ли какой-нибудь способ для Mongoid обрабатывать эту таблицу соединений из коробки? Я видел пару своих собственных решений для самостоятельной работы, но ничто не выглядит эффектно. Есть ли способ справиться с этим? Или это случай, когда я не должен использовать Mongoid?
Как реализовать мангоидные ассоциации "многие-ко-многим"?
Ответ 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.