在数据库表中存储大量布尔值的最佳方法是什么?
我应该为每个布尔值创建一个列还是有更优化的方法?
员工表
IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
...等
答案 0 :(得分:1)
我没有看到每个布尔值都有一个列的问题。但是如果您预见到将来会有任何扩展,并希望仅使用表 来表示布尔值,那么请使用带有VARIABLE和VALUE列的2列表,每个bool都有一行。
答案 1 :(得分:1)
如果大多数员工在大样本中具有相同的值,则定义层次结构可能更有效,允许您建立表示标准的默认值,并在需要时覆盖每个员工。
您的员工表不再存储这些属性。相反,我会创建一个属性定义表:
| ATTRIBUTE_ID | DESCRIPTION | DEFAULT |
| 1 | Is Hard Working | 1 |
| 2 | Is Overpaid | 0 |
然后第二个表将属性连接到Employees:
| EMPLOYEE_ID | ATTRIBUTE_ID | OVERRIDE |
| 2 | 2 | 1 |
鉴于两名员工,ID为1的员工没有覆盖条目,因此继承了默认属性值(工作正常,未多付),但员工2具有属性2的覆盖 - 过度支付,并且因此,既努力又多付。
为了完整性,您可以在覆盖表中的EMPLOYEE_ID和ATTRIBUTE_ID列上放置一个唯一约束,强制您只能为每个员工覆盖一次属性。
答案 2 :(得分:0)
需要考虑的事项:您多久会添加/更改/删除这些布尔值?如果他们不太可能改变那么你可能会喜欢将它们作为单独的列。许多数据库可能会为您打包,特别是如果它们在行中相邻,那么它们将被有效存储。
另一方面,如果你看到自己想要每隔一段时间添加/更改/删除这些布尔值,你可能会更喜欢这样的事情(借助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)
);
答案 3 :(得分:0)
每个列都是您业务需求的最佳代表。您可以将一堆bool组合到一个int列中,并使用位掩码来读取值,但这似乎不必要地复杂,并且只有在需要高端性能时才会考虑。
此外,如果您使用的是sql server,最多8位字段会在内部合并到一个int中,因此性能问题已经完成了。 (我不知道其他dbs是否这样做。)