[英]Should I use an ENUM for primary and foreign keys?
关联者已创建一个模式,该模式在查找表上使用ENUM()
列作为主键。 该表将产品代码“FB”转换为其名称“Foo Bar”。
然后,该主键在其他地方用作外键。 目前,FK也是一个ENUM()
。
我认为这不是一个好主意。 这意味着要连接这两个表,我们最终会进行四次查找。 这两个表加上两个ENUM()
。 我对么?
我更喜欢让FK成为CHAR(2)
以减少查找次数。 我也更喜欢PK也是CHAR(2)
来完全减少它。
ENUM()
的好处是获得对值的约束。 我希望有类似的东西: CHAR(2) ALLOW('FB', 'AB', 'CD')
我们可以用于PK和FK列。
什么是:
这个概念也在别处使用。 如果ENUM()
的值更长怎么办? ENUM('Ding, dong, dell', 'Baa baa black sheep')
。 现在, ENUM()
从空间的角度来看很有用。 如果有几百万行使用这些值,我应该只关心这个吗? 在这种情况下, ENUM()
可以节省存储空间。
ENUM应该用于定义给定字段的可能值范围。 这也意味着您可能有多个行,这些行具有相同的值。
我不建议将ENUM用于主键类型的外键类型。
使用ENUM作为主键意味着添加新密钥将涉及修改表,因为必须先修改ENUM,然后才能插入新密钥。
我猜你的同事试图限制谁可以插入一个新行,并且该行数是有限的。 我认为这应该通过数据库级别或应用程序的适当权限设置来实现,而不是通过使用ENUM作为主键。
恕我直言,使用ENUM作为主键类型违反了KISS原则 。
但是当你只用不同的10行或更少的行捕获时不会有问题
CREATE TABLE `grade`(
`grade` ENUM('A','B','C','D','E','F') PRIMARY KEY,
`description` VARCHAR(50) NOT NULL
)
获取DML不仅仅是这个表
我们已经对它进行了更多的讨论,这就是我们提出的:
到处使用CHAR(2)。 对于PK和FK。 然后使用mysql的外键约束来禁止在查找表中不存在的行中创建FK。
looking up of ENUM()
s or table L
and can know with certainty that there's a row in L
if (when) we need it. 这样一来,给查找表是L
,和两个指表X
和Y
,我们可以加入X
到Y
没有抬头的ENUM()
S或表L
,可以肯定地知道,有一排L
,如果(当) 我们需要。
我仍然对评论和其他想法感兴趣。
拥有查找表和枚举意味着您始终在两个位置更改值。 有趣......我们花了很多年时间使用枚举导致我们需要重新编译以添加值的问题。 近年来,在许多情况下,我们已经使用查找表中的值从枚举中移除了。 我喜欢查找表的最大值是您无需编译即可添加或更改值。 即使有数百万行,我也会坚持使用查找表,只是在数据库设计中保持智能
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.