1

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

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

员工表

IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
...等等。

4

4 回答 4

1

我认为每个布尔值都有一个列没有问题。但是,如果您预见到任何未来的扩展,并且只想将该表用于布尔值,那么请使用具有 VARIABLE 和 VALUE 列的 2 列表,每个布尔值对应一行。

于 2010-04-22T00:27:46.007 回答
1

如果大多数员工在大样本量中具有相同的值,则定义层次结构会更有效,允许您建立代表规范的默认值,并在需要时覆盖每个员工的默认值。

您的员工表不再存储这些属性。相反,我会创建一个属性定义表:

| 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 列上放置唯一约束,强制您只能覆盖每个员工一次的属性。

于 2010-04-22T00:36:06.780 回答
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)
);
于 2010-04-22T00:31:54.543 回答
0

每个列都是您业务需求的最佳代表。您可以将一堆 bool 组合成一个 int 列并使用位掩码来读取值,但这似乎不必要地复杂,并且只有在需要一些高端性能时才会考虑。

此外,如果您使用的是 sql server,最多 8 位字段会在内部组合成一个 int,因此性能方面的事情已经为您完成了。(我不知道其他数据库是否这样做。)

于 2010-04-22T00:32:46.100 回答