在DB中存储标志

时间:2011-01-16 16:00:53

标签: database-design bitmask

在我的申请中,我希望用户选择他的工作日。然后将它们存储在数据库中。当然,我的应用程序将处理用户的数据,如:今天是特定用户的工作日,谁是今天应该工作的用户,等等。

我的问题是,这样做的最佳做法是什么?我应该使用:

  1. 用户表中的位掩码字段
  2. 通过为days,users和days_users创建表来创建多对多关系表。 提前谢谢你。

3 个答案:

答案 0 :(得分:8)

我想说位掩码字段是一种关系反模式。

字段应该只有一个有意义的值,否则最终会出现查询问题 - 每次需要使用它进行查询时都会解析字段。

这样的字段还需要额外的文档,因为它存储的值不是自我描述的。

答案 1 :(得分:2)

Bitmasking字段本质上有点神秘,您需要创建其他内容来解释存储在位掩码中的内容。

第二种方法更加透明,易于理解,如果您需要添加更多值,它会更灵活一些。使用位掩码,每次添加一个与关系方法相比可能是维护噩梦的值时,您再次需要重做位图解码器。

答案 2 :(得分:2)

我犯了选项1的错误,并且有机会回到过去,我绝对会这样做。

您的数据库几乎肯定不会使用索引对您的位掩码进行按位查询。因此,如果您想找到每个星期二工作的人,那么您每次都要进行索引扫描。随着你的桌子越来越大,这会破坏你的表现。您可以尝试通过提前缓存SELECT DISTINCT(bitmaskfield),在您自己的应用程序中执行位掩码逻辑并将其转换为适当的WHERE bitmaskfield IN (...)子句来优化此操作,但这很快就会变得无法维护在您更改数据库中的值的每个位置更新您的distinct-bitmask缓存。

额外的表和连接可能看起来很痛苦,但是位掩码会变得更糟。相信我。将您的数据库用作数据库。