我应该使用ENUM作为主键和外键吗?

时间:2009-02-16 03:02:42

标签: sql mysql enums

关联已创建一个架构,该架构在查找表上使用ENUM()列作为主键。该表将产品代码“FB”转换为其名称“Foo Bar”。

然后将该主键用作其他地方的外键。目前,FK也是ENUM()

我认为这不是一个好主意。这意味着要连接这两个表,我们最终会进行四次查找。这两个表加上两个ENUM()。我是对的吗?

我希望FK为CHAR(2)以减少查找次数。我也希望PK也CHAR(2)来完全减少它。

ENUM()的好处是获得对值的约束。我希望有一些类似于CHAR(2) ALLOW('FB', 'AB', 'CD')的东西,我们可以用于PK和FK列。

什么是:

  1. 最佳实践
  2. 您的偏好

这个概念也在别处使用。如果ENUM()的值更长,该怎么办? ENUM('Ding, dong, dell', 'Baa baa black sheep')。现在ENUM()从空间的角度来看很有用。如果有几百万行使用这些值,我应该只关心这个吗?在这种情况下,ENUM()可以节省存储空间。

4 个答案:

答案 0 :(得分:5)

ENUM应该用于定义给定字段的可能值范围。这也意味着您可能有多个行具有相同的该特定字段的值。

我不建议将ENUM用于主键类型的外键类型。

使用ENUM作为主键意味着添加新密钥将涉及修改表,因为必须先修改ENUM才能插入新密钥。

我猜你的同事试图限制谁可以插入新行并且该行数量有限。我认为这应该通过数据库级​​别或应用程序的适当权限设置来实现,而不是通过使用ENUM作为主键。

恕我直言,使用ENUM作为主键类型违反了KISS principle

答案 1 :(得分:4)

但是当你只用不同的10行或更少的行捕获时不会出现问题

e.g的

CREATE TABLE `grade`(
    `grade` ENUM('A','B','C','D','E','F') PRIMARY KEY,
    `description` VARCHAR(50) NOT NULL
) 

这张表获得 DML

是不同的

答案 2 :(得分:2)

我们已经对此进行了更多的讨论,这就是我们提出的建议:

到处使用CHAR(2)。对于PK和FK。然后使用mysql的外键约束来禁止在查找表中不存在的行中创建FK。

这样,鉴于查找表为L,以及两个引用表XY,我们可以将X加入Y而不用任何查找ENUM()或表L,并且可以肯定地知道L中是否有一行(如果)(我们需要)。

我仍然对评论和其他想法感兴趣。

答案 3 :(得分:0)

拥有查找表和枚举意味着您始终在两个位置更改值。有趣......我们花了很多年时间使用枚举导致我们需要重新编译以添加值的问题。近年来,在许多情况下,我们已经使用查找表中的值从枚举中移除了。我喜欢查找表的最大值是您无需编译即可添加或更改值。即使有数百万行,我也会坚持使用查找表,只是在数据库设计中保持智能化