Database design 在数据库中存储标志

Database design 在数据库中存储标志,database-design,bitmask,Database Design,Bitmask,在我的应用程序中,我希望用户选择他的工作日。然后将它们存储在数据库中。当然,我的应用程序将处理用户的数据,例如:今天是特定用户的工作日吗,今天应该工作的用户是谁。。。等等 我的问题是,这样做的最佳实践是什么?我应该使用: 用户表中的位掩码字段 通过为天、用户和天用户创建表来创建多对多关系表。 先谢谢你 我认为位掩码字段是一种关系反模式 一个字段应该只有一个有意义的值,否则就会出现查询问题——每次需要使用字段进行查询时都会对其进行解析 这样的字段还需要额外的文档,因为它存储的值不是自描述的。位掩码

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

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

  • 用户表中的位掩码字段
  • 通过为天、用户和天用户创建表来创建多对多关系表。 先谢谢你

  • 我认为位掩码字段是一种关系反模式

    一个字段应该只有一个有意义的值,否则就会出现查询问题——每次需要使用字段进行查询时都会对其进行解析


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

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


    第二种方法更透明、更容易理解,如果需要添加更多值,则更灵活。使用位掩码,每次添加一个值时,您都需要重新制作位图解码器,与关系方法相比,这可能是维护的噩梦。

    我犯了错误,选择了选项1,如果有机会回到时间,我绝对会选择另一种方法

    您的数据库几乎肯定不会使用索引对位掩码进行逐位查询。所以,如果你想找到,比如说,每个周二工作的人,你每次都要做一次索引扫描。当您的表变大时,这可能会破坏您的性能。您可以通过提前缓存
    SELECT DISTINCT(bitmaskfield)
    ,在您自己的应用程序中执行位掩码逻辑,并将其turing到适当的
    WHERE-bitmaskfield in(…)
    子句中,来尝试围绕这一点进行优化,但这很快变得无法维护,因为您必须在数据库中更改值的每个位置更新不同的位掩码缓存


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

    这是非常主观的。你和你的房子倾向于清晰还是优化?此外,这两者是否是一个因素在很大程度上取决于您的环境。尽管这与Ling2Sql和
    标志
    枚举映射很好地配合,例如
    用户
    角色
    表,其中用户可能有多个角色,而不需要第三个表。诚然,从表面上看,这意味着对数据/逻辑的依赖,但没有考虑到当今时代语言/平台的可转移功能。@失望先生-我喜欢多对多表方法的明确性。位字段需要额外的文档(除非以您描述的确切方式使用)。我倾向于同意,只是把它扔掉了。