4

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

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

  1. 用户表中的位掩码字段
  2. 通过为 days、users 和 days_users 创建表来创建多对多关系表。先感谢您。
4

3 回答 3

8

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

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

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

于 2011-01-16T16:06:28.670 回答
2

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

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

于 2011-01-16T16:11:20.710 回答
2

我犯了选择选项 1 的错误,如果有机会回到过去,我绝对会选择另一种方式。

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

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

于 2011-01-16T16:17:52.913 回答