如果我有几个对象,每个对象基本上都有一个Profile
,我用来存储随机属性的对象是什么,优缺点是什么:
- 将序列化的哈希存储在记录的列中,与
- 存储一堆作为
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% 的时间我不需要按 custom 搜索settings
。只是想知道在性能和未来问题的可能性方面的权衡是什么。定制的数量settings
可能在 10 到 50 之间。
我宁愿选择第二个选项,即设置表,因为它遵循 ActiveRecord 面向对象的约定。但我想知道在这种情况下是否会带来过高的性能成本。
注意:我只是想知道 RDBMS。这将非常适合 MongoDB/Redis/CouchDB/等。但我想纯粹了解 SQL 的优缺点。