【问题标题】:Create relationship table for one-row relationships?为单行关系创建关系表?
【发布时间】:2012-11-24 13:44:31
【问题描述】:

我有以下结构:

-- Table Users ---
-  User1
-  User2
-  User3

-- Table Roles ---
-  Role1
-  Role2
-  Role3
-  Role4

每个用户都必须有一行,不多也不少。我应该创建一个新表,例如。 `user_roles" 并在其中存储用户角色,例如:

-- Table user_roles --
-  user_id = User1     role_id = Role2
-  user_id = User2     role_id = Role1
-  user_id = User3     role_id = Role4

或者,我应该将用户角色存储在Users 表中吗?由于每个用户始终只有一个角色,我认为没有理由不将其保留在Users 表中。我的想法是正确的还是应该放在单独的表格中?很简单的问题,但我想了很久。过去我将“密钥”保留在Users 表中。

【问题讨论】:

    标签: mysql database relationship


    【解决方案1】:

    要强制每个用户必须只有一个角色,您应该在 users 表中添加一个 role_id,使其成为 not null 并引用角色表

    create table roles 
    (
      id integer primary key,
      role_name varchar(50) not null
    );
    
    create table users
    (
       id integer not null primary key,
       username varchar(50) not null,
       role_id integer not null,
       ... other columns ...
    );
    alter table users 
       add constraint fk_users_rol 
       foreign key (role_id) references roles(id);
    

    【讨论】:

      【解决方案2】:

      如果规范不会改变,您可以将 RoleID 存储在用户表中。为了扩展,如果您希望将来支持每个用户的更多角色,您可能有 UserRoles 表。现在:

      Users(UserID, UserName, ..... RoleID);
      

      【讨论】:

      • 使用 UserRoles 表几乎不可能强制用户拥有至少一个角色(这是当前的要求)。如果情况发生变化,以后可以轻松地转移到 m:n 关系。
      • 这就是为什么我说是为了将来。目前,Users 表中的 RoleID 是可以的。
      • 用户将永远无法添加更多角色,这将始终相同。但是,我将通过将用户添加到“组”来添加对用户进行分组的方法。每个用户都可以附加到多个组,等等。编辑:为此,我将有一个单独的“组”表和“user_groups”来附加它们。
      • 没关系。我想答案是一样的,只要 Role 不超过一个,在 Users 表中就可以了。创建单独的表没有意义
      猜你喜欢
      • 2021-05-28
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 2012-05-02
      • 2014-07-13
      • 2013-02-08
      • 2017-04-13
      相关资源
      最近更新 更多