Sql Rails:一种独立于数据库的数据类型';它适合于按位操作

Sql Rails:一种独立于数据库的数据类型';它适合于按位操作,sql,ruby-on-rails-3,postgresql,bit-manipulation,bit-masks,Sql,Ruby On Rails 3,Postgresql,Bit Manipulation,Bit Masks,我有一个Rails应用程序,其中包含一些资源,我需要在这些资源上运行涉及位操作的查询。现在,我正在使用PostgreSQL,我为我的“用户”模型创建了一个迁移,该模型使用postgres特定的“位变化”数据类型,因为这是postgres网站上建议的按位“&”操作: add_column :users, :timeslots, :'BIT VARYING' 在我的一个查询中,我这样使用“&”: self.where("available_lbs > 0 AND status = 0 AND

我有一个Rails应用程序,其中包含一些资源,我需要在这些资源上运行涉及位操作的查询。现在,我正在使用PostgreSQL,我为我的“用户”模型创建了一个迁移,该模型使用postgres特定的“位变化”数据类型,因为这是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)
这似乎在我的机器上起作用,但有两个问题:

  • 数据类型和查询都是特定于数据库的,因此,如果迁移到另一个数据库,我可能需要更改一些内容
  • 此迁移似乎没有正确更新schema.rb文件。在描述如何创建表时,它仍然使用Rails“string”数据类型:
  • 创建表格“用户”:force=>true do | t|

    t、 字符串“时隙”,:limit=>nil

    结束


    因此,当我在一台新机器上安装应用程序时,它使用了错误的数据类型,结果出现故障。有什么好的解决办法吗?(我尝试使用“二进制”数据类型,但这似乎对postgres不起作用)

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

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

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


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

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

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

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


    如果选择位字段,通常会以性能为代价优化大小/内存使用。我从来没有看到过PostgreSQL在这方面的比较,但微处理器/微控制器的汇编级别就是这样:即使在内存受限的微控制器中,您通常也会选择
    bool
    (需要一个字节,在对齐的情况下可能需要四个字节),因为访问速度更快,而且它需要更少的指令。这篇文章可能会帮助你。这篇文章有一些关于数学的好信息,但它没有说任何关于处理数据库方面的内容。你为什么在关系数据库中使用位运算符?这通常是一件令人讨厌的事情,您的数据库可能会因此讨厌您。我正在尝试查找所有用户记录,其中“时间段”字段与我传入的另一个“时间段”字段的和大于0。我觉得在查询中这样做要比把它们全部拉到Ruby中并在Ruby中进行更快。但是为什么
    timeslot
    是位图呢?为什么不使用对关系数据库更自然的表示呢?位图在C中是有意义的,但在其他地方它们几乎总是过早优化。本文可能会帮助您这篇文章有一些关于数学的好信息,但它没有说明任何关于处理数据库方面的内容。为什么在关系数据库中使用位运算符?这通常是一件令人讨厌的事情,您的数据库可能会因此讨厌您。我正在尝试查找所有用户记录,其中“时间段”字段与我传入的另一个“时间段”字段的和大于0。我觉得在查询中这样做要比把它们全部拉到Ruby中并在Ruby中进行更快。但是为什么
    timeslot
    是位图呢?为什么不使用对关系数据库更自然的表示呢?位图在C语言中是有意义的,但在其他地方它们几乎总是过早优化。所有这些都是好的方面。我以前使用过这种方法,但我有168个不同的时隙(一周中每小时一个),每个时隙都直接映射到UI中日历上的一个单元格。如果我使用一对多关系,我需要用168个不同的时隙为数据库种子,然后维护一个巨大的联接表来跟踪哪些用户有哪些时隙。在我看来,这是相当令人讨厌的,所以翻转碎片看起来要干净得多。我想我要做的是将位域分解成7个整数,每个整数代表一周中的不同日子。你能把你的数据模型添加到你的问题中吗?您有与时间段有多对多关系的用户,可能绑定到某个时间段(=每个月/年/周不同等)?是的,这是一种多对多关系,但月/年/周不会以任何方式记录,并且与此无关。它只是一个记录,每个用户在任何给定的一周内都有1小时的时间段。因此,对于10000个用户,每个用户每天分配10个时间段,您将有700000行。这不应该是个问题。你可以用时间范围来代替“以小时为单位的时间段”,但这并不是必须的。无论这些分配存储在位字段还是行中,逻辑数据卷都是相同的。除非有性能问题,否则我不会将其反规范化为7个整数。所有这些都很好。我以前使用过这种方法,但我有168个不同的时隙(一周中每小时一个),每个时隙都直接映射到UI中日历上的一个单元格。如果我使用一对多关系,我需要用168个不同的时隙为数据库种子,然后维护一个巨大的联接表来跟踪哪些用户有哪些时隙。在我看来,这是相当令人讨厌的,所以翻转碎片看起来要干净得多。W