在数据库表中存储大量布尔值的最佳方法是什么?
我应该为每个布尔值创建一个列还是有更优化的方法?
员工表
IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
...等等。
在数据库表中存储大量布尔值的最佳方法是什么?
我应该为每个布尔值创建一个列还是有更优化的方法?
员工表
IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
...等等。
我认为每个布尔值都有一个列没有问题。但是,如果您预见到任何未来的扩展,并且只想将该表用于布尔值,那么请使用具有 VARIABLE 和 VALUE 列的 2 列表,每个布尔值对应一行。
如果大多数员工在大样本量中具有相同的值,则定义层次结构会更有效,允许您建立代表规范的默认值,并在需要时覆盖每个员工的默认值。
您的员工表不再存储这些属性。相反,我会创建一个属性定义表:
| ATTRIBUTE_ID | DESCRIPTION | DEFAULT |
| 1 | Is Hard Working | 1 |
| 2 | Is Overpaid | 0 |
然后第二个表将属性连接到员工:
| EMPLOYEE_ID | ATTRIBUTE_ID | OVERRIDE |
| 2 | 2 | 1 |
给定两个员工,ID 为 1 的员工没有覆盖条目,因此继承了默认属性值(努力工作,没有多付),但是员工 2 有一个覆盖属性 2 - 是多付的,因此两者都是辛勤工作和高薪。
为了完整性,您可以在覆盖表中的 EMPLOYEE_ID 和 ATTRIBUTE_ID 列上放置唯一约束,强制您只能覆盖每个员工一次的属性。
需要考虑的事情:您多久添加/更改/删除这些布尔值?如果它们不太可能改变,那么您可能会喜欢将它们作为单独的列。许多数据库可能会为您打包它们,特别是如果它们在行中相邻,因此它们将被有效地存储。
另一方面,如果您发现自己想要每隔一段时间添加/更改/删除这些布尔值,您可能会更好地使用类似的东西(请原谅 PostgreSQL 主义和伪劣名称):
CREATE TABLE employee_qualities (
id SERIAL8 PRIMARY KEY,
label TEXT UNIQUE
);
CREATE TABLE employee_employee_qualities (
employee_id INT8 REFERENCES employee (id),
quality_id INT8 REFERENCES employee_qualities (id),
UNIQUE (employee_id, quality_id)
);
每个列都是您业务需求的最佳代表。您可以将一堆 bool 组合成一个 int 列并使用位掩码来读取值,但这似乎不必要地复杂,并且只有在需要一些高端性能时才会考虑。
此外,如果您使用的是 sql server,最多 8 位字段会在内部组合成一个 int,因此性能方面的事情已经为您完成了。(我不知道其他数据库是否这样做。)