gpt4 book ai didi

sql - 在 ActiveRecord 中存储序列化哈希与键/值数据库对象的优缺点?

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:46 25 4
gpt4 key购买 nike

如果我有几个对象,每个对象基本上都有一个Profile,我用什么来存储随机属性,有什么优缺点:

  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% 的时间我不需要通过自定义 settings 进行搜索。只是想知道在性能和 future 出现问题的可能性方面的权衡是什么。自定义设置的数量可能在 10-50 之间。

我宁愿选择第二个选项,使用设置表,因为它遵循 ActiveRecord 面向对象的约定。但我想知道在这种情况下是否会导致性能成本过高。

注意:我想知道的只是 RDBMS。这将非常适合 MongoDB/Redis/CouchDB/等。但我只想知道 SQL 方面的优缺点。

最佳答案

我有同样的问题,但最终做出了决定。

哈希序列化选项使维护成为问题。很难查询、扩展或重构此类数据——任何细微的更改都需要迁移,这意味着读取每条记录反序列化和序列化,并且根据重构序列化异常可能发生。我尝试了二进制序列化和 JSON - 第二种更容易提取和修复,但仍然太麻烦。

我现在正在尝试使用单独的设置表 - 更易于维护。我打算使用 Preferences gem 用于主要完成所有抽象以便于使用的东西。我不确定它是否适用于 Rails 3 - 它很小,所以如果需要我可以扩展它。

2013 年 11 月更新

最近发布的 Rails 4 支持 PostgreSQL 9.1+ 的重要新功能,例如动态数据集的 hstorejson 列类型。这是一篇涵盖 hstore usage in Rails 4 的文章.两种类型都支持索引和高级查询功能(Json with Pg 9.3)。 Hstore 也可供 Rails 3 用户使用 activerecord-postgres-hstore gem 。

我正在将项目中的一些非关键偏好表迁移到 hstores。在迁移中,我只更新表定义并为每个表执行一个 SQL 查询来移动数据。

关于sql - 在 ActiveRecord 中存储序列化哈希与键/值数据库对象的优缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com