Sql 将数据库字符串枚举转换为整数是否值得?

Sql 将数据库字符串枚举转换为整数是否值得?,sql,enums,database-agnostic,Sql,Enums,Database Agnostic,在数据库中存储枚举类型有两种方法:作为字符串或整数 将枚举(sex={male,female},account_type={regular,pro,admin}等)保存为字符串可以使内容更可读,但需要比整数更多的空间 另一方面,整数需要在数据库内外映射枚举。作为一个优点,区分大小写在数据库之外使用整数进行处理 假设两者都被索引,那么进行整数转换通常值得吗?使用整数查找要快多少 示例 也许一个具体的例子有助于把事情形象化。 让我们用100000个用户的数据库来考虑上述帐户类型 字符串枚举 假设8位

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

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

另一方面,整数需要在数据库内外映射枚举。作为一个优点,区分大小写在数据库之外使用整数进行处理

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

示例

也许一个具体的例子有助于把事情形象化。 让我们用100000个用户的数据库来考虑上述帐户类型

字符串枚举

假设8位固定长度字符类型

7*100000*8/8 = 700000 bytes
整数枚举

假设8位TINYINT整数

100000*8/8 = 400000 bytes

似乎整数枚举的大小几乎是一半。还需要对索引进行整理。

答案是,正如您所料,这取决于具体情况

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


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

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


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

始终存在一个问题,即数据库是否由人查看,而不是通过执行转换的应用程序查看。如果有人出于任何原因查看数据库,文本会更好——尤其是如果有DBA可能无法访问代码以查看枚举转换,这种情况更为明显

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

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


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

实际上,不管怎样,您可能希望在数据库中创建一个映射表。
这会处理很多事情-
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
对于检索问题,
(枚举映射值)
(性别映射Id、语言Id)
应该是唯一的(或至少从视图返回唯一)。
Enum\u Mapped\u Value
应该是一些字符代码(可能是5个字符?),用于将Enum映射到数据库。不要使用序数值或枚举本身的名称-使用构造函数指定的内部值;否则,未来的开发人员可能会对枚举重新排序或重命名,但内部值更可能被忽略。
Language\u Id
应该作为外键映射到某种类型的
Language\u映射
表,如果您计划处理多种语言