当前位置: 首页 > 面试题库 >

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

颜阳炎
2023-03-14
问题内容

如果我有几个对象,每个对象基本上都有一个Profile,我正在使用什么来存储随机属性,那么它们的优缺点是什么:

  1. 将序列化的散列存储在列中以进行记录,而不是
  2. 存储一堆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%的时间不需要按自定义进行搜索settings。只是想知道在性能和未来问题的可能性方面要进行哪些权衡。自定义的数量settings可能会在10到50之间。

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

注意:我只想知道RDBMS。这将非常适合MongoDB / Redis / CouchDB / etc。但我只想了解SQL的优缺点。


问题答案:

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

哈希序列化选项导致维护问题。很难查询,扩展或重构此类数据-
任何细微的更改都需要迁移,这意味着读取每个记录进行反序列化和序列化,并且取决于重构序列化异常,可能会发生。我同时尝试了二进制序列化和JSON-
第二种方法更易于提取和修复,但仍然很麻烦。

我现在正在尝试使用单独的设置表-
易于维护。我计划将Preferences
gem用于大多数抽象的目的,以便于使用。我不确定它是否可以与Rails 3一起使用-它很小,所以我可以根据需要扩展它。

2013年11月更新

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

我正在将项目中的一些非关键首选项表迁移到hstore。在迁移中,我只更新表定义execute每个表一个SQL查询以移动数据。



 类似资料:
  • 问题内容: 使用ruby-on-rails,我想存储3个元素的数组:帖子的最后3条评论。我知道我可以将Comment表加入Post 1,但是我会避免出于扩展目的而进行大量的请求。 所以我想知道什么是存储这三个元素的最佳方法,因为我想在每次发表新评论时轻松地更新它们:删除最后一条评论并添加新评论。 正确的方法是什么?将其存储在序列化数组还是JSON对象中? 问题答案: 您可以使用ActiveReco

  • 问题内容: 我有一个简单的问题,当我想将SHA1哈希的结果存储在MySQL数据库中时发生: 我将散列结果存储在 VARCHAR 字段中多长时间? 问题答案: 我将使用可变长度的数据,但不使用固定长度的数据。由于SHA-1值 始终为 160位长,因此将仅在固定长度字段的长度上浪费一个额外的字节。 而且我也不会存储返回的值。因为每个字符只使用4位,因此需要160/4 = 40个字符。但是,如果每个字符

  • 长度为10的哈希表使用带有哈希函数h(k)=k mod 10的开放寻址和线性探测。在向空哈希表中插入8个值后,该表如下所示 使用同一哈希函数和线性探测的键值的多少个不同插入序列将产生如上所示的哈希表? 答案是128。 我知道91,2,13,24,77是5!=120但我不知道其他8种组合是什么?

  • 我正在创建一个web应用程序,它有一个用户对象,每个用户对象都有一个需要存储到mySQL数据库表中的对象(食物)的ArrayList。我想将整个ArrayList存储到一列中。将其存储为Json会更好吗?或者我应该为每个用户创建一个表来存储ArrayList的各个项目吗?我唯一的问题是数据会被频繁编辑。 编辑:我有供用户和食物使用的桌子。其想法是,用户将食物表中的食物添加到他们的ArrayList

  • 我有一个HashMap,其中类的对象(对象1,对象2,对象3)作为键,java.util.Date(日期1,日期2,日期3)作为值。HashMap已经根据值进行了排序,即基于日期对象。键对象具有名为name的属性。 现在,当HashMap的值相同时,即当值的日期相同时,我需要检查键对象的名称(obj.name),并根据键对象的名称属性对HashMap进行排序。请注意,只有当HasHMap和值的日期

  • 问题内容: 我在Redis中存储MessagePacked哈希时遇到问题。我在下面粘贴了一个测试用例。从Redis中提取打包数据并对其进行解压缩时,哈希会略有损坏。当哈希值超出一定长度时,似乎会发生这种情况,尽管我不能肯定地说。 我正在使用Redis 2.4.17(默认配置),Ruby 1.9.3p194,MessagePack 0.4.7和Redis gem 3.0.2。使用节点也会发生相同的问