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映射
表,如果您计划处理多种语言