在google cloud sql(mysql)db table vs enum columns

时间:2017-10-09 18:47:45

标签: mysql database database-design google-cloud-sql

我的项目有很多主数据(例如:状态,区域设置,设备等)。要存储主数据,我看到以下选项

  1. 在mysql中使用Enum列。问题是,每次添加新条目时,都必须更改表。获取枚举中的值列表并不是直截了当的。
  2. 为每个主数据创建表并维护外键引用。
  3. 只需将其存储为mysql表中的字符串即可。并将主数据作为代码中的枚举进行管理,甚至将其存储在云数据存储区中(以便于操作)
  4. 最好的方法是什么。如果有其他好的选择,请建议。

1 个答案:

答案 0 :(得分:0)

好的,讨论ENUM的优点(和缺点)......

<强> ENUM

  • ENUM需要1个字节(如果您有> 255个可能值,则为2个字节)。
  • 您应该在CREATE TABLE时指定所有可能的值。
  • 稍后您可以使用ALTER TABLE将新值添加到ENUM。运行它(在最新版本的MySQL上)是“便宜的”如果你只在列表的 end 上添加新选项。
  • 与所有数据类型一样,ENUM列可以是NULL或NOT NULL。如果你使它NULLable,需要额外的一点(其他地方)来保持它 信息。你需要考虑“NULL”在你的意思中应该是什么意思 应用程序。相反,我建议使用NOT NULL并使第一个选项成为NULL所指的任何内容。
  • 如果您确实为ENUM编制索引,则可能仍未使用它。 WHERE my_enum = 'something'不太可能在my_enum上使用索引,除非 '某事'发生在不到10-30%的行中。 (我不能给你 一个确切的数字 - 优化器有自己的想法。交换 从使用索引到进行表扫描通常是“正确的 事情“当索引值'太'常见时。)

<强> VARCHAR

    包含VARCHAR(77)
  • abcde占用1 + 5个字节 - 长度为1,实际字符为5。 (ETC)

查找表

  • 有一个包含AUTO_INCREMENTVARCHAR的2列表格。
  • 索引每一栏。
  • 编写代码以为每个新值添加新列。
  • 使用JOIN从ID中获取字符串。
  • id可能是1字节TINYINT UNSIGNED(值0..255),因此它与ENUM一样紧凑。
  • 考虑您是否需要SMALLINT UNSIGNED(0..65535)。
  • 如果选项可能会增长很多,这可能是最好的。
  • 谨防INSERT IGNORE - 它可能会烧掉AUTO_INCREMENT个ID,并且很快会超过255个。

<强>评论

  • 所有变体都可以处理字符串,但有些变体比其他变体更复杂(JOIN)。
  • VARCHAR是磁盘空间中成本最高的。
  • 某些情况下,由于额外的JOIN,额外表格的情况会非常昂贵。

有了这些优点和缺点,你决定。没有“最好的方法”。