我有一个MySQL表users
,其中包含以下列:
要管理角色系统,以下任何一个选项是否存在缺点?
选项1:
创建第二个名为roles
的表,其中包含三列:role_id
(主键),name
和description
,然后将users.user_id
与{{roles.role_id
相关联1}}作为名为users_roles
的第三个表中的外键?
或者...
选项2:
创建第二个名为roles
的表,其中包含两列:user_id
(来自users.user_id
的外键)和role
(ENUM)? ENUM数据类型列允许将允许的角色的简短列表作为值插入。
之前我从未在MySQL中使用ENUM数据类型,所以我只是好奇,因为选项2意味着少一个表。我希望这是有道理的,这是我第一次尝试在论坛中描述MySQL表。
答案 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)名称);
会自动加载到
对象动物 动物 - >类别 动物 - >名称