Prós / contras de armazenar hash serializado vs. objeto de banco de dados de chave / valor no ActiveRecord?

Se eu tiver vários objetos, cada um com basicamente umProfile, o que estou usando para armazenar atributos aleatórios, quais são os prós e os contras de:

Armazenando um hash serializado em uma coluna para um registro, vs.Armazenando vários objetos de chave / valor quebelong_to o objeto principal.Código

Digamos que você tenha registros STI como estes:

class Building < ActiveRecord::Base
  has_one :profile, :as => :profilable
end
class OfficeBuilding < Building; end
class Home < Building; end
class Restaurant < Building; end

Cadahas_one :profile

Opção 1. Hash serializado
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
Opção 2. Armazenamento de Chave / Valor
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

Qual você escolheria?

Suponha que 99% das vezes não precise pesquisar pelo costumesettings. Imaginando quais são as vantagens e desvantagens em termos de desempenho e a probabilidade de problemas futuros. E o número de costumesettings provavelmente estará entre 10 e 50.

Prefiro ir com a segunda opção, com a tabela de configurações, porque segue as convenções orientadas a objetos do ActiveRecord. Mas estou me perguntando se nesse tipo de situação teria um custo de desempenho muito alto.

Nota: Gostaria de saber apenas em termos de RDBMS. Isso seria o ajuste perfeito para o MongoDB / Redis / CouchDB / etc. mas quero conhecer apenas os prós e os contras em termos de SQL.

questionAnswers(3)

yourAnswerToTheQuestion