Если у меня есть несколько объектов, каждая из которых имеет в основном Profile
, что я использую для хранения случайных атрибутов, каковы плюсы и минусы:
- Сохранение сериализованного хэша в столбце для записи, vs.
- Сохранение кучи объектов ключа/значения, которые
belong_to
являются основным объектом.
код
Скажите, что у вас есть записи STI, подобные этим:
class Building < ActiveRecord::Base
has_one :profile, :as => :profilable
end
class OfficeBuilding < Building; end
class Home < Building; end
class Restaurant < Building; end
Каждый has_one :profile
Вариант 1. Сериализованный хэш
class SerializedProfile < ActiveRecord::Base
serialize :settings
end
create_table :profiles, :force => true do |t|
t.string :name
t.string :website
t.string :email
t.string :phone
t.string :type
t.text :settings
t.integer :profilable_id
t.string :profilable_type
t.timestamp
end
Вариант 2. Магазин ключей/значений
class KeyValueProfile < ActiveRecord::Base
has_many :settings
end
create_table :profiles, :force => true do |t|
t.string :name
t.string :website
t.string :email
t.string :phone
t.string :type
t.integer :profilable_id
t.string :profilable_type
t.timestamp
end
create_table :settings, :force => true do |t|
t.string :key
t.text :value
t.integer :profile_id
t.string :profile_type
t.timestamp
end
Что бы вы выбрали?
Предположим, что в 99% случаев мне не нужно будет искать пользовательский settings
. Просто интересно, каковы компромиссы с точки зрения производительности и вероятности будущих проблем. И количество пользовательских settings
, вероятно, будет где угодно от 10-50.
Я бы предпочел использовать второй вариант с таблицей настроек, поскольку он следует объектно-ориентированным соглашениям ActiveRecord. Но мне интересно, будет ли в такой ситуации слишком высокая стоимость исполнения.
Примечание. Мне интересно только с точки зрения РСУБД. Это было бы идеально подходит для MongoDB/Redis/CouchDB/и т.д. но я хочу знать чисто плюсы и минусы в терминах SQL.