У меня проблемы с созданием довольно сложной схемы для моего приложения. У меня есть объекты и пользователи, и пользователи могут создавать, как и в отличие от многих объектов, и наоборот, наоборот. Поэтому я настроил свои модели так:
class User < ActiveRecord::Base
has_many :userobjects, :foreign_key => "user_id"
has_many :likedobjects, :through => :userobjects, :source => :object, :conditions => ['userobjects.liked = ?', true]
has_many :dislikedobjects, :through => :userobjects, :source => :object, :conditions => ['userobjects.liked = ?', false]
has_many :createdobjects, :through => :userobjects, :source => :object, :conditions => ['userobjects.created = ?', true]
class Object < ActiveRecord::Base
has_many :userobjects, :foreign_key => "object_id"
has_many :likers, :through => :userobjects, :source => :user, :conditions => ['userobjects.liked = ?', true]
has_many :dislikers, :through => :userobjects, :source => :user, :conditions => ['userobjects.liked = ?', false]
has_many :creators, :through => :userobjects, :source => :user, :conditions => ['userobjects.created = ?', true] #array of length 1
class Userobjects < ActiveRecord::Base
belongs_to :user
belongs_to :object
Среди наиболее частых операций я хочу получить понравившиеся / не понравившиеся объекты current_user и понравившиеся / не понравившиеся объекты для данного объекта. Однако, как мы все знаем, обе эти операции требуют соединений, которые требуют больших вычислительных затрат. Учитывая, что: root - это страница объектов и их понравившихся / не понравившихся, а профиль - список понравившихся / не понравившихся объектов, приведенная выше схема просто не кажется правильной. Каков подход для сортировки встраивания / кэширования ассоциации в объекте / пользователе?
Может быть, это один из сценариев, где схема на основе документов, такая как MongoDb, более эффективна? Я еще не слишком много занимался моделированием схемы, поэтому не уверен, что лучше всего подходит