【问题标题】:Using a bit mask to store unrelated bit columns使用位掩码存储不相关的位列
【发布时间】:2012-10-12 06:34:37
【问题描述】:

我正在设计一张桌子。有几个相互无关的位列。

我正在考虑将这些列合并到一个通用的 ATTRIBUTES INT 位掩码列中。

现在,我试图说服自己这是一个坏主意。这似乎是一种反模式。如果我稍后需要另一个位列,这可能会节省我一些时间,但除此之外真的有什么好处吗?

如果我在位掩码上有一个索引,并且我通过 ATTRIBUTES & 128 = 128 进行搜索,那么我怀疑它效率不高。索引将使所有内容按整个值排序,而不是按位排序。所以,我想它实际上只需要扫描整个索引而不是确切地知道去哪里。

听起来对吗?这是一个可怕的想法吗?

谢谢, 泰德兹

【问题讨论】:

  • 这是一个很好的缺点。在您看来,优点是什么?
  • 就我个人而言,我会将它们分开。设置东西确实需要更多时间,但这样其他人将来学习你的数据库会容易得多。据我所知,这是唯一的主要区别。
  • 下次我需要添加另一列时不必更新所有架构脚本、存储过程和业务对象是我能想到的唯一真正好处。

标签: sql-server database-design


【解决方案1】:

使用位掩码列

  • 代码更难阅读和维护
  • 索引使用不可能

这也违反了数据库设计的正常形式。

您也无需购买空间,因为 SQL Server 可以将多个位列压缩为一个字节。

但是,由于位列自然不是很有选择性,因此在这里使用索引也可能没有优势。

单个位列的总体优势明显超过位掩码列的优势。所以我几乎在所有情况下都会使用一位列。

【讨论】:

  • 您可以索引计算列(这当然也否定了优势)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2021-03-09
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多