枚举数据类型与MySQL中的数据表?

时间:2010-06-02 07:05:06

标签: mysql database database-design

我有一个MySQL表users,其中包含以下列:

  1. user_id(PK)
  2. 电子邮件
  3. 名称
  4. 密码
  5. 要管理角色系统,以下任何一个选项是否存在缺点?

    选项1:

    创建第二个名为roles的表,其中包含三列:role_id(主键),namedescription,然后将users.user_id与{{roles.role_id相关联1}}作为名为users_roles的第三个表中的外键?

    或者...

    选项2:

    创建第二个名为roles的表,其中包含两列:user_id(来自users.user_id的外键)和role(ENUM)? ENUM数据类型列允许将允许的角色的简短列表作为值插入。

    之前我从未在MySQL中使用ENUM数据类型,所以我只是好奇,因为选项2意味着少一个表。我希望这是有道理的,这是我第一次尝试在论坛中描述MySQL表。

2 个答案:

答案 0 :(得分:9)

通常,ENUM类型不适合在这些情况下使用。如果您打算在将来添加或删除角色的灵活性,则尤其如此。更改ENUM值的唯一方法是使用ALTER TABLE,而在自己的表中定义角色只需要roles表中的新行。

此外,使用roles表可以添加其他列以更好地定义角色,例如您在选项1中建议的description字段。如果您使用的话,这是不可能的。 ENUM类型,如选项2中所示。

在这些情况下,我个人不会选择ENUM。也许我可以看到它们被用于具有绝对有限值集合的列,例如{Spades, Hearts, Diamonds, Clubs}来定义卡片的套装,但不是在有问题的情况下,因为前面提到的缺点。 / p>

答案 1 :(得分:0)

对案例使用ENUM如果您在接收端有一个严格定义的ORM,则表示只有在将数据库行自动映射到平面对象列表时才有意义。

实施例: 表动物(ENUM('爬行动物','mamals')类别,(varchar 50)名称);

会自动加载到

对象动物   动物 - >类别   动物 - >名称