我有一个带有几个资源的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)
这似乎适用于我的机器,但有两个问题:
create_table“users”,:force =>真的做| t |
t.string“timeslots”,:limit =>零
端
因此,当我在新机器上设置应用程序时,它使用了错误的数据类型并且事情中断了。有什么好的解决方案吗? (我尝试使用'binary'数据类型,但这似乎不适用于postgres)
答案 0 :(得分:1)
我建议规范化数据模型:用户---一对多--->时隙。
这是可移植的,您可以使用所有更高级别的SQL函数,如窗口聚合等。
此外,您的记录是“人类可读的”,例如在即席查询中,因为它们不需要逐位操作。
如果选择位字段,通常会以性能为代价优化大小/内存使用量。我从未见过有关PostgreSQL的比较,但在微处理器/微控制器的汇编级别就是这种情况:即使在内存受限的微控制器中,通常选择bool
(需要一个字节,如果对齐可能为四个)因为访问速度更快,所以需要更少的指令。而且编码和调试也更容易。