【问题标题】:Is converting database string enums to integers worth it?将数据库字符串枚举转换为整数值得吗?
【发布时间】:2011-07-18 11:11:45
【问题描述】:

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

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

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

假设两者都被索引,那么进行整数转换通常值得吗?查找整数的速度有多快?

示例

也许一个具体的例子可以帮助将事物形象化。 让我们使用包含 100,000 个用户的数据库的上述 account_type。

字符串枚举

假设 8 位定长 CHAR 类型

7*100000*8/8 = 700000 bytes

整数枚举

假设 8 位 TINYINT 整数

100000*8/8 = 400000 bytes

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

【问题讨论】:

    标签: sql enums database-agnostic


    【解决方案1】:

    正如您所料,答案是视情况而定。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          实际上,无论如何,您可能想要做的是在数据库中创建一个映射表。
          这需要处理很多事情 -
          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 表,如果您 曾经计划处理不止一种语言。

          【讨论】:

            猜你喜欢
            • 2014-09-27
            • 2012-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多