在数据库中存储一对多列的最佳方法

时间:2014-11-03 19:21:29

标签: mysql sql database fieldtype

我的数据库中有一个users表,有三种用户角色 - 经理(管理员),专家和学生。

我已尝试将其角色存储在role表中的users列,但我的问题是存储它的最佳方法是什么?

例如,我应该使用数字 - 1表示管理员,2表示专家,3表示学生。或者只有一个字符 - 管理员为“A”,专家为“E”,学生为“S”?或管理员等完整的字符串'admin',或者是什么?

修改

伙计们,我想要最有效率的方式。你们中的一些人告诉我要有另一张桌子,但这种关系并不多,这是一对一的,因为用户只能有一个角色。

3 个答案:

答案 0 :(得分:5)

您可能希望拥有一个单独的联结表,例如user_roles,其中包含以下列:iduser_idrole_id。这样,每个用户将来可以拥有多个角色,即使现在他们只有1个。

并且role_id将指向新roles表中的角色,该表可以包含与角色关联的所有数据。

或者,如果您真的不想要联结表,那么只需将role_id直接放入users表。

查找数据库"规范化"。基本上,如果您有一组特定的数据将在列中重复,您可能希望将其放在自己的表中。

答案 1 :(得分:1)

您可以创建一个显示2列的单独表格:role_nbr,角色值为: 1,管理员; 2,专家; 3,学生

然后在您的users表中包含role_nbr并使用数字,将其链接到角色表以查找角色名称。这样,如果您增加了角色,就可以轻松添加到单独的表中。一个很好的研究将是关于规范化 - 这将帮助你消除存储重复信息的地方,你需要存储大量信息(比如角色名称 - 因为存储一个数字或字母 - 你怎么记得它代表什么?)

答案 2 :(得分:0)

使用enum类型。这是一个例子

CREATE TABLE users (
    -- the other columns
    role ENUM('admin, 'expert', 'student')
);
  

ENUM是一个字符串对象,其值从允许值列表中选择,这些值在表创建时在列规范中显式枚举。

这意味着enum类型已定义了值(并且每行只能包含一个值 - 您不能拥有admin的用户同一时间student)。在您的情况下,它们是adminexpertstudent

DOCS