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:
belong_to
o objeto principal.CódigoDigamos 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
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 / Valorclass 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.