【问题标题】:how to store work schedule information using a bitmask?如何使用位掩码存储工作计划信息?
【发布时间】:2011-11-18 07:18:08
【问题描述】:

创建一个非常简单的日程安排应用

我要求用户告诉我他们在哪一天工作,以及他们在某一天是早上、午餐还是晚上工作

因此,对于给定用户,她的数据可能是以下矩阵中的一个或所有点

        morning    lunch    evening
mon
tue
wed
thr
fri
sat
sun 

我需要能够快速检索此信息,以便提醒用户该上班了。我会有很多用户。

我不关心具体的日期或时间。只有离散的第 1 天到第 7 天以及每天的 3 个时段。当然,有很多可能的组合。

我正在考虑如何存储这些信息。而且我想知道位掩码是否合适/可行/“使用这样的方法”?您将如何处理?

谢谢!

【问题讨论】:

  • 您打算将这些信息存储在哪里? RDBMS 中的位操作会导致表扫描,这会扼杀“快速检索”部分。
  • 老问题,但是 FWIW,我的(类似)问题的最佳解决方案是无需查看代码就可以完全清楚数据库的含义。

标签: ruby-on-rails ruby bitmask


【解决方案1】:

虽然位掩码肯定会起作用(使用 7 天 X 3 班 = 21 位),但我对这些事情的经验是它们总是需要修改。也就是说,增加一个夜班,或者换班。

鉴于此,我建议在您的应用中增加一些灵活性。将位掩码的想法与定义位表示的表结合起来。这样您就可以根据需要重新定义和修改。如果添加班次,只需在定义表中添加一条记录并更新每个员工的掩码即可。

【讨论】:

    【解决方案2】:

    回答您的第二个问题:除非您有数百万行,否则位掩码不会带来巨大的性能优势(您的瓶颈仍然是网络 I/O)并且可能是过早的优化。也就是说,您将能够将所有用户的选项存储在一个 32 位整数中。

    【讨论】:

      【解决方案3】:

      不要为位掩码而烦恼。现在做一些简单的事情(比如规范化的 DB 模式!),然后在开始测量问题时优化性能。

      【讨论】:

        【解决方案4】:

        如果他们每天只能选择一个选项,您可以将数据打包成 16 位 int 的 14 位。或者,如果他们每天可以选择多个选项,您可以将其打包成 32 位 int 的 21 位。

        【讨论】:

        • 问题是Ruby,我认为这是C。翻译很明显,但只是提醒一下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        相关资源
        最近更新 更多