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

2023-12-20

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

  1. 将序列化哈希存储在记录的列中,与将序列化哈希存储在记录的列中不同。
  2. 存储一堆键/值对象belong_to主要对象。

Code

假设您有如下 STI 记录:

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

Each 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/等。但我想纯粹了解 SQL 方面的优缺点。


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

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

我现在尝试使用单独的设置表 - 更容易维护。我打算使用优先 http://github.com/pluginaweek/preferencesgem 的主要功能是为了方便使用而进行所有抽象。我不确定它是否适用于 Rails 3 - 它很小,所以如果需要我可以扩展它。

2013 年 11 月更新

最近发布的 Rails 4 支持 PostgreSQL 9.1+ 的出色新功能,例如hstore or json动态数据集的列类型。这是一篇文章涵盖Rails 4 中的 hstore 使用 http://rny.io/rails/postgresql/2013/08/03/custom-fields-in-rails-using-postgresql-hstore.html。两种类型都支持索引和高级查询功能(Json with Pg 9.3)。 Rails 3 用户也可以使用 Hstoreactiverecord-postgres-hstore https://github.com/diogob/activerecord-postgres-hstore gem.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • mysql 中 INSERT 语句的计算列

    假设我想要一个表来记录其他表中的日期和列数 或者任何类型的数学 字符串连接等 CREATE TABLE log id INTEGER NOT NULL AUTO INCREMENT date DATETIME NOT NULL count
  • JbdcTemplate - 带有动态 SQL 查询的PreparedStatements

    I know jdbcTemplate可以用来创建PreparedStatements如果你这样设置 i e private JdbcTemplate jdbcTemplate String sqlQuery Select from tab
  • 如何显示关联记录子集的表单,其中一些记录尚不存在?

    我有任务和用户 当用户完成任务时 我创建一个完成 其中有一个字段供用户指示他们花费了多长时间 我需要一个表格来显示所有任务及其完成状态和 time spent 属性 提交时 应更新现有的完成情况并创建新的完成情况 如果可能的话 我想在 Fo
  • 如何从连接字符串中提取数据库名称,而不考虑 RDBMS?

    我正在研究一个不知道正在使用的 RDBMS 的课程 当然 应用程序的其余部分都清楚这一点 连接字符串是此类的输入 我需要数据库名称 无论 RDBMS 如何 如何从连接字符串中提取数据库名称 我读到以下问题 如何使用 SqlConnectio
  • Rails 4 与 MailCatcher 和 Devise gems

    我有一个带有 gem Devise 的应用程序 我需要通过电子邮件确认注册 在配置 环境 rb我添加了这个 ActionMailer Base delivery method smtp ActionMailer Base smtp sett
  • ruby CSV重复行解析

    我有一些需要处理的 CSV 数据 但无法找到匹配重复项的方法 数据看起来有点像这样 line id name item 1 item 2 item 3 item 4 1 251 john foo foo foo foo 2 251 john
  • 法语和西班牙语的特殊字符可以保存在 varchar 中吗?

    法语和西班牙语中有普通英语中不使用的特殊字符 重音元音等 varchar 是否支持这些字符 或者我需要一个 nvarchar 吗 注 我愿意NOT希望讨论我是否应该使用 nvarchar 还是 varchar 您在谈论什么 SQL 实现 我
  • C# 查询两个数据库的数据

    我目前有一个查询 我正在从两个不同的数据库获取数据 这些数据被附加到一个名为 accountbuys 的列表中 我的第一个表有三个数据条目 3个想要购买股票的帐户 下一张表有 17 个数据点 购买 17 只股票 I am merging t
  • Ruby on Rails link_to 与 put 方法

    我是 Rails 新手 我正在尝试使用 link to 帮助程序创建一个发出 PUT 请求而不是 GET 请求的链接 具体来说 我正在尝试创建一个链接 从管理员面板激活我的应用程序中的用户帐户 我正在使用 Rails 3 0 5 我的rou
  • 如何显示 RSpec 测试生成的 SQL 查询日志?

    我正在为我的 Rails 3 应用程序编写规范 我想测试数据库事务是否真的有效 如果能够看到我的应用程序在规范驱动下生成的 sql 查询 这将非常有帮助 有没有办法像在 Rails 控制台中一样查看查询 我正在使用 Rails 3 0 9
  • Rails 4 - 如何在开发中使用 sqlite3 以及在生产中使用 PostgreSQL 和 Heroku

    我正在尝试部署到 Heroku 但不能 因为默认的 sqlite3 服务器仍然存在 检测到 Heroku 不支持 sqlite3 gem https devcenter heroku com articles sqlite3 https d
  • If Else 条件的 SQLite 语法

    我正在使用 SQLite 数据库 我的表有一个名为 密码 的文本列 早些时候 为了检索我用来执行简单操作的值select from myTable询问 但现在的要求是 如果Password值不是NULL那么我需要将其显示为 是 或 否 它是
  • 选择两列中两个日期之间的记录

    如何选择两列中两个日期之间的记录 Select From MyTable Where 2009 09 25 is between ColumnDateFrom to ColumnDateTo 我有一个日期 2009 09 25 我喜欢选择
  • Solr 增量导入不起作用

    我使用的是solr 4 2 请注意 完全导入有效 但增量导入却无效 增量导入不会给出任何错误 但不会获取任何更改 这是数据配置文件
  • 在 RSpec 测试期间抑制控制台输出

    我正在测试在控制台上放置一些消息的类 包含 put p 警告等 我只是想知道在 RSpec 测试期间是否有能力抑制此输出 我压抑puts通过重定向在我的类中输出 stout到一个文本文件 这样 如果我出于任何原因需要查看输出 它就在那里 但
  • Rails:验证字符串的最小和最大长度,但允许其为空白

    我有一个想要验证的字段 我希望该字段能够留空 但如果用户输入数据 我希望它采用某种格式 目前我在模型中使用以下验证 但这不允许用户将其留空 validates length of foo maximum gt 5 validates len
  • 为什么每个方法需要将其循环的值分配给变量?

    在 Rails 上工作 发现我对 Rails 的理解缺乏知识each method 不知道为什么each方法需要变量 message h2 h2 不确定为什么每个方法都需要变量 message 事实并非如此require它 你完全可以忽略它
  • Rails & Devise:如何在没有布局的情况下呈现登录页面?

    我知道这可能是一个简单的问题 但我仍在试图弄清楚Devise https github com plataformatec devise out 我想要render layout gt false在我的登录页面上 我怎样才能做到这一点Dev
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • SQLite 中的累积求和值

    我正在尝试在 SQLite 中执行值的累积和 我最初只需要对一列求和并获得代码 SELECT t MyColumn SELECT Sum r KeyColumn1 FROM MyTable as r WHERE r Date lt t Da

随机推荐

  • 如何从单个 uitableViewcell 获取多个按钮?

    我正在做一个测验tableView有 4 个按钮 选项 我将它们标记在故事板上 例如 201 202 203 204 并成功地将它们全部放入tableView方法 但是将目标添加到按钮后 我无法在其中获取特定按钮buttonClicked
  • 使用 Popen.wait() 时重现死锁

    从文档中使用Popen wait https docs python org 2 library subprocess html subprocess Popen wait may 使用 stdout PIPE 和 或 stderr PIP
  • 如何在 IntelliJ 中设置 sql 方言

    我正在使用 IntelliJ 2017 我想为 sql 文件设置 SQL 方言 创建文件后 顶部有一条消息 指出未设置该文件的 SQL 方言 当我单击 将方言更改为 链接时 它会打开 SQL 方言菜单 右侧有一个下拉链接可以选择方言 但下拉
  • pytz 和 astimezone() 不能应用于简单的日期时间

    我有一个约会 我需要让它知道时区 local tz timezone Asia Tokyo start date 2012 09 27 start date datetime strptime start date Y m d start
  • 如何将波浪数据转换为复数

    我正在从麦克风读取原始数据并输入 FFT 我正在尝试的两个 FFT 库 AForge http code google com p aforge and 外皮质 http www exocortex org dsp 将复数作为输入并给出复数
  • 将计算机设置为通过 ps/2、usb 或其他有线连接连接到另一台计算机的 HID 设备

    我有兴趣设置一台机器 主机 A 并通过 USB 或 ps 2 将其连接到另一台机器 主机 B 以便主机 B 将主机 A 识别为键盘 在主机 A 上 运行着一个人工神经网络 它会动态生成输入序列 对我来说很重要的是 主机 A 只能以 人类 方
  • 将全角标点字符替换为正常宽度的等效字符[重复]

    这个问题在这里已经有答案了 file1包含一些 s 这是全角 我想变成常规 s 这是我们常用的冒号 我如何在 bash 中执行此操作 也许是一个Python脚本 恕我直言 python不是适合这项工作的工具 perl is perl CSA
  • 如何在自动映射器中将字符串映射到日期?

    我有一个有效日期的字符串 但它是一个字符串并且它需要是一个字符串 但是 当我尝试将其自动映射到日期时间时 它会引发异常 Trying to map System String to System DateTime Trying to map
  • 谁提出了“DIANA 节点”这个术语?他们是如何计算出 6,000,000 LOC 大约是 67108864 (2**26) 个 DIANA 节点? [复制]

    这个问题在这里已经有答案了 在共享内存池中 有包规范 对象类型规范 独立子程序或匿名块限制为 67108864 2 26 DIANA 节点对应于标识符等令牌 关键字 运算符等 戴安娜代表什么 我知道完整的表格 但它到底是什么 我已经提到过戴
  • Docker 上的 Wordpress:无法在已安装的卷上创建目录

    这是 Wordpress Docker 容器中路径中的原始文件 var www html docker exec 5b957c7b9c5ad054883694afbfb80d3c9df6707458d55011f471be0701f3890
  • 获取 sscanf 读取的字符数?

    我正在解析一个字符串 achar 并且我正在使用sscanf将字符串中的数字解析为双精度数 如下所示 char expression double value 0 sscanf expression lf value 这很好用 但我想继续通
  • 使用RestKit,使用块加载对象,何时以及如何取消请求?

    RKObjectManager sharedManager loadObjectsAtResourcePath app site pattern usingBlock RKObjectLoader loader loader setObje
  • 类型 types.Transactions 没有字段或方法 GetRlp

    我正在尝试在 go ethereum 中创建原始交易 并发现了一些我正在修改的教程代码 错误是 transaction raw create go 65 18 ts GetRlp undefined type types Transacti
  • 如何在java fx中每2秒更新一次标签框?

    我正在尝试在应用程序 GUI 中模拟基本恒温器 我想每 2 秒更新一次标签框值与新的温度值 例如 我的初始温度将显示为 68 度 并每 2 秒更新为 69 度 70 度等 直到 75 度 这是我用Java fx写的一段代码 controlp
  • 自动确定图例的位置

    您可以在大多数绘图程序中手动定位关键图例 例如 在 gnuplot 中 它是使用set key top right 在ggplot2中 就完成了像这样 https stackoverflow com questions 2954005 ho
  • 我是否在 RHEL 上正确安装了 Ruby 1.9.3?

    在你说之前yum y install ruby193 我就是这么做的 请注意 我不是 Ruby 开发人员 但需要将此程序作为其他开发人员通过 Web 服务工作的一部分 他没空 任何帮助将不胜感激 我尝试按照说明安装库并得到 root ctb
  • JQuery 检测底部滚动

    我希望在用户滚动到页面底部时实现内容加载 我遇到问题了 它在桌面浏览器上运行良好 但在移动设备上则不然 我已经实施了一个肮脏的修复程序 使其可以在 iPhone 上运行 但并不是最佳的 因为它无法在其他尺寸的移动设备上运行 我的网站是 ww
  • 返回组的第一行

    我有一个数据框 其中包含ID 这对于组中的每个元素 两个日期时间以及这两个时间间隔都是相同的 日期时间对象之一是我的相关时间标记 现在我想获取数据帧的子集 其中包含每个组的最早条目 条目 尤其是时间间隔 需要保持不变 我的第一个方法是根据
  • git 和本地修改

    我正在探索如何使用 git 我刚刚做了以下测试 创建一个文件夹和2个文件 然后 git init git add git commit m 初始提交 创建分支 gitbranchexperimental gitcheckoutexperim
  • 在 ActiveRecord 中存储序列化哈希与键/值数据库对象的优缺点?

    如果我有几个对象 每个对象基本上都有一个Profile 我用什么来存储随机属性 有什么优点和缺点 将序列化哈希存储在记录的列中 与将序列化哈希存储在记录的列中不同 存储一堆键 值对象belong to主要对象 Code 假设您有如下 STI