问题描述
我正在为日志系统设计数据库表。关于一个领域,我有两个想法。我应该创建三个“bit(1)”属性还是一个“enum”属性?
is_error bit(1)
is_test bit(1)
is_embedded bit(1)
或
boolErrors enum(is_error_true,is_error_false,is_test,is_test_false,is_embedded_ is_embedded_false)
显然,持有枚举在语义和空间上似乎不合适,但性能如何。当我有 3 列而不是 1 列时,获取时间会增加吗?
解决方法
如果看起来标志代表状态(也就是说,在给定的时间点只有一个标志可能为真),那么我会推荐一列,如{{1 }} 数据类型。您可以使用引用表来存储所有可能的标志及其名称,而不是使用 integer
,使用整数列从原始表中引用它。
另一方面,如果可能有多个标志(例如,ENUM
和 is_error
),则单列是不够的。您可以创建多个列(如果标志列表从不更改),也可以使用桥接表将每个状态存储在单独的行中。
如果一次只能设置其中一个标志,请使用 ENUM
。
如果可以同时设置多个标志,请使用SET
。
性能真的不是什么值得担心的事情。处理表格中的一行的主要“成本”是获取该行,而不是列中发生的事情的详细信息。
当然,“越小越好”有几个原因——I/O 等。但是 ENUM
是 1 或 2 个字节; SET
最多 8 个字节(最多 64 个标志)。对于任何用例来说,这两者都相当小。
至于速度和可索引性,让我们看看主要查询。