2017-10-09 26 views
1

我的项目有很多主数据(例如:状态,地区,设备等)。要存储主数据,我看到以下选项在谷歌云管理主数据的最佳方式sql(mysql)数据库表vs列列

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

什么是最佳方式。如果还有其他不错的选择,请提出建议。

回答

0

OK,讨论枚举的优点(和缺点)...

ENUM

  • 枚举需要1个字节(2,如果你有> 255个的可能值)。
  • 您应该在CREATE TABLE时指定所有可能的值。
  • 稍后,您可以通过ALTER TABLE将新值添加到ENUM。运行它(在最新版本的MySQL上)是“便宜”如果您只在列表的上添加新选项。
  • 与所有数据类型一样,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 IDS,并迅速超过255

评论

  • 所有变种可以处理字符串,但也有一些更复杂(JOIN)比其他。
  • VARCHAR是磁​​盘空间中成本最高的。
  • 部分由于额外的JOIN,额外的外壳可能会相当昂贵。

武装这些利弊,你决定。没有“最佳方式”。

相关问题