【问题标题】:Storing flags in a DB在数据库中存储标志
【发布时间】:2011-01-17 00:27:34
【问题描述】:

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

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

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

【问题讨论】:

  • 这是非常主观的。你和你的房子倾向于清晰还是优化?此外,其中任何一个是否是这里的一个因素在很大程度上取决于您的环境。

标签: database-design bitmask


【解决方案1】:

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

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

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

【讨论】:

  • 虽然这可以很好地与 Ling2Sql 和 Flags 枚举映射配合使用,例如使用 UserRole 表,其中用户可能有多个角色,省略了对第三个表的需要.诚然,从表面上看,这意味着对数据/逻辑的依赖,但并没有考虑到当今时代语言/平台的可转移功能。
  • @Mr.失望——我喜欢多对多表方法的明确性。位字段需要额外的文档(除非以您描述的确切方式使用)。
  • 我倾向于同意,只是把它扔在那里。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2013-01-04
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多