6

在数据库中存储枚举类型有两种方法:作为字符串或作为整数。

将枚举 ( sex = {male,female}, account_type = {regular,pro,admin}, 等 ) 保存为字符串可以使内容更具可读性,但比整数需要更多空间。

另一方面,整数需要将枚举映射进出数据库。作为一个好处,区分大小写是在数据库之外用整数处理的。

假设两者都被索引,那么进行整数转换通常值得吗?使用整数查找要快多少?

例子

也许一个具体的例子可以帮助可视化事物。让我们将上面的 account_type 与 100,000 个用户的数据库一起使用。

字符串枚举

假设 8 位固定长度 CHAR 类型

7*100000*8/8 = 700000 bytes

整数枚举

假设 8 位 TINYINT 整数

100000*8/8 = 400000 bytes

似乎大小几乎是整数枚举的一半。还需要考虑索引。

4

4 回答 4

3

答案是,正如您所料,这取决于。

数据库越大,节省的空间就越显着——不仅在磁盘上,而且在网络 IO 和计算上。

就个人而言,我会存储整数而不是文本值,除非有直接的数据库支持枚举(如 MySQL 那样)。

于 2011-07-18T11:13:25.607 回答
1

如果数据库大小成为问题,整数将占用更少的内存。

这取决于您是否直接从数据库返回值而不通过代码层(例如某种形式的翻译)。如果是,那么您将需要数据库中的字符串值(但是您可以将它们作为查找存储在相关表中)

于 2011-07-18T11:15:42.137 回答
0

实际上,无论如何,您可能想要做的是在您的数据库中创建一个映射表。
这需要处理许多事情 -
1)您像往常一样分配一个 Id 列,然后将外键分配给适当的列。这可以防止插入无意义的值。这也处理标准化问题。
2) 使用映射表,您可以使用视图来构建仅限数据库的选择,这只需将 id 值换成必要的文本字符串。
3)使用映射表,处理国际化问题也变得更容易(注意:这并不一定意味着更简单,确切地说)。这是我为此设置表格的方法:

Gender_Mapping
Id | Enum_Mapped_Value | DBA_Readable_Description

Gender_Description
Id | Gender_Mapping_Id | Language_Id | Language_Specific_Description

对于检索问题,(Enum_Mapped_Value)并且(Gender_Mapping_Id, Language_Id)应该是唯一的(或至少从视图中返回唯一)。
Enum_Mapped_Value应该是一些用于将枚举映射到数据库的字符代码(可能是 5 个字符?)。不要使用序数值或枚举本身的名称 - 使用构造函数分配的内部值;否则,未来的开发人员可能会重新排序枚举,或重命名它们——但内部值更有可能被置之不理。如果您打算处理一种以上的语言
Language_Id则应该将其作为外键映射到某种表。Language_Mapping

于 2011-07-18T18:37:30.897 回答
0

始终存在数据库是否会被人类查看的问题,而不是通过执行转换的应用程序。如果某人出于某种原因正在查看数据库,那么文本会更好——如果有可能无法访问代码以查看枚举转换的 DBA 尤其如此。

如果存储数据的大小更重要,那么转换为整数是一个更好的主意。但是对于这个改进的空间,您会失去可读性。这取决于什么是最重要的因素。

当然,您可以包含 SProcs 或 Views 等来查看存储的整数数据并将其转换为字符串值,如果您需要在两者之间取得平衡,这将是有意义的。

但正如奥德所说——没有一个简单的答案。每种情况都会略有不同。

于 2011-07-18T11:18:44.167 回答