布尔值的数据库表

时间:2010-04-22 00:16:39

标签: database database-design boolean-logic

在数据库表中存储大量布尔值的最佳方法是什么?

我应该为每个布尔值创建一个列还是有更优化的方法?

员工表

IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
...等

4 个答案:

答案 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是否这样做。)