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

时间:2011-07-18 11:11:45

标签: sql enums database-agnostic

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

将枚举(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 个答案:

答案 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表。