有两种方法可以在数据库中存储枚举类型:字符串或整数。
将枚举(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
似乎大小几乎是整数枚举的一半。还需要统一索引。
答案 0 :(得分:3)
答案是,正如您所料,这取决于。
数据库越大,节省的空间越大 - 不仅在磁盘上,而且在网络IO和计算中也是如此。
就个人而言,我会存储整数而不是文本值,除非枚举有直接的DB支持(如MySQL那样)。
答案 1 :(得分:1)
如果数据库的大小成为一个问题,整数将占用更少的内存。
这取决于您是否直接从数据库返回值而不通过您的代码层(例如某种形式的翻译)。如果你那么你需要数据库中的字符串值(但是你可以将它们存储为相关表中的查找)
答案 2 :(得分:0)
总是存在这样的问题:数据库是否将由人类查看,而不是通过执行转换的应用程序。如果一个人出于任何原因正在查看数据库,那么文本会更好 - 如果有DBA可能无法访问代码以查看枚举转换,则尤其如此。
如果存储数据的大小更重要,那么转换为int是更好的主意。但是对于这种改进的空间,你会失去可读性。这取决于最重要的因素。
当然,您可以包含SProcs或Views等,以查看存储的整数数据并将其转换为字符串值,如果您需要在两者之间取得平衡,这将是有意义的。
但正如奥德德所说 - 没有一个简单的答案。每种情况都会略有不同。
答案 3 :(得分: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
表。