1

我有一个带有几个资源的 Rails 应用程序,我需要在这些资源上运行涉及按位运算的查询。现在,我正在使用 PostgreSQL,并为我的“用户”模型创建了一个迁移,该模型使用 postgres 特定的“BIT VARYING”数据类型,因为这是在 postgres 网站上推荐的按位“&”操作:

add_column :users, :timeslots, :'BIT VARYING'

在我的一个查询中,我以这种方式使用“&”:

self.where("available_lbs > 0 AND status = 0 AND ? & timeslot > 0::bit AND available_end >= ?", user.timeslots, Time.now)

这似乎在我的机器上工作,但有两个问题:

  1. 数据类型和查询都是特定于数据库的,所以如果我迁移到另一个数据库,我可能不得不改变一些事情
  2. 此迁移似乎没有正确更新 schema.rb 文件。在描述如何创建表时,它仍然使用 Rails 'string' 数据类型:

create_table "users", :force => true do |t|

t.string "timeslots", :limit => nil

结尾

因此,当我在新机器上设置应用程序时,它使用了错误的数据类型并且事情中断了。对此有什么好的解决方案吗?(我尝试使用“二进制”数据类型,但这似乎不适用于 postgres)

4

1 回答 1

1

我建议规范化数据模型:用户---一对多--->时间段。

这是可移植的,您可以使用所有更高级别的 SQL 函数,如窗口聚合等。

此外,您的记录是“人类可读的”,例如在临时查询中,因为它们不需要按位操作。

如果您选择位域,您通常会优化大小/内存使用,但会以性能为代价。我从未见过关于 PostgreSQL 的比较,但在微处理器/微控制器的组装级别就是这种情况:即使在内存受限的微控制器中,您通常也会选择bool(需要一个字节,如果对齐可能需要四个字节),因为访问速度更快,并且需要更少的指令。而且它更容易编码和调试。

于 2013-06-14T21:02:17.663 回答