Плюсы / минусы хранения сериализованного хэша по сравнению с объектом базы данных ключ / значение в ActiveRecord?

Если у меня есть несколько объектов, каждый из которых имеет в основном профиль , то, что я использую для хранения случайных атрибутов, каковы плюсы и минусы:

  1. Хранение сериализованного хэша в столбце для запись, а не
  2. Хранение группы объектов ключ / значение, которые принадлежат главному объекту.

Код

Допустим, у вас есть такие записи 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% случаев мне не нужно искать с пользовательскими настройками . Просто интересно, каковы компромиссы с точки зрения производительности и вероятности будущих проблем. А количество пользовательских настроек , вероятно, будет от 10 до 50.

Я бы предпочел второй вариант с таблицей настроек, потому что он соответствует объектно-ориентированным соглашениям ActiveRecord. Но мне интересно, не обойдется ли это в такой ситуации слишком дорого.

Примечание: меня интересуют только термины РСУБД. Это идеально подходит для MongoDB / Redis / CouchDB / и т. Д. но я хочу знать чисто плюсы и минусы с точки зрения SQL.

16
задан Lance Pollard 13 September 2010 в 03:05
поделиться