在谷歌云sql(mysql)数据库表与枚举列中管理主数据的最佳方式



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

  1. 在mysql中使用Enum列。问题是,每次添加新条目时,都必须更改表。获取枚举中的值列表不是一件简单的事
  2. 为每个主数据创建表,并维护外键引用
  3. 只需将其作为字符串存储在mysql表中即可。并将主数据作为代码中的枚举进行管理,甚至将其存储在云数据存储中(便于操作)

最好的方法是什么。如果还有其他好的选择,请提出建议。

OK,来讨论ENUM的优点(和缺点)。。。

简体中文

  • ENUM占用1个字节(如果可能的值大于255,则为2)
  • 在创建CREATE TABLE时,应该指定所有可能的值
  • 稍后,您可以通过ALTER TABLE向ENUM添加新值。运行它(在MySQL的最新版本上)是"便宜的">如果你只在列表的末尾添加新选项
  • 与所有数据类型一样,ENUM列可以是NULL或NOT NULL。如果你把它做成NULLable,就需要一个额外的比特(在其他地方)来容纳它信息。您需要思考"NULL"在您的应用程序。相反,我建议使用NOT NULL,并将第一个选项设置为NULL的含义
  • 如果您确实对ENUM进行了索引,它可能仍然无法使用。WHERE my_enum = 'something'不太可能对my_enum使用索引,除非"something"出现在不到10-30%的行中。(我不能给你一个精确的数字——优化器有自己的想法。切换从使用索引到进行表扫描通常是"正确的"当索引值"太常见"时。)

VARCHAR

  • 包含abcdeVARCHAR(77)占用1+5个字节——长度为1,实际字符为5。(等等)

查找表

  • 有一个包含AUTO_INCREMENTVARCHAR的2列表
  • 为每列编制索引
  • 编写代码为每个新值添加一个新列
  • 使用JOIN从id中获取字符串
  • id可能是一个1字节的TINYINT UNSIGNED(值0..255),因此它与ENUM一样紧凑
  • 考虑是否需要SMALLINT UNSIGNED(0..65535)
  • 如果选项可能会增长很多,这可能是最好的选择
  • 小心INSERT IGNORE——它可能会烧毁AUTO_INCREMENTID,并迅速超过255

评论

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

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

相关内容

  • 没有找到相关文章

最新更新