如何为多用户Java应用设计/持久化用户角色(当前和已注册)?

时间:2019-07-17 01:58:12

标签: java postgresql database-design user-roles multi-user

我正在构建一个应用程序,该应用程序允许每个用户选择他们是否要注册为播放器,还可以选择注册为管理员。他们可以同时注册为玩家和管理员,但只能拥有一个当前角色->即,在给定时间只能以任一玩家/管理员身份登录。

我正在使用Player-Role模式,其中Player和Admin类扩展抽象的UserRole类。

我应该创建哪种表结构来支持这种方式:

  • 我可以存储用户注册的角色列表
  • 我可以根据需要存储和检索用户的当前用户角色

例如,我希望数据库支持以下代码,以在Player.getRole()中获得用户的当前角色,而在Admin.getRole()中获得一个类似的角色:

        User userWithID = User.getUser(userWithID);
        UserRole playerRole = null;
        List<UserRole> userRoles = userWithID.getRoles();
        for(UserRole role : userRoles){
            if(role instanceof Player){
                playerRole = role;
                break;
            }
        }
        if(playerRole == null) throw new IllegalAccessError("Player with ID does not exist");
        else{
            return (Player) playerRole;
        }



问题出现了,我需要来自用户角色的两种信息。 1-注册的角色,以及2-当前角色。而且UserRole是抽象的。

注意:在将其标记为重复项之前: 关于StackOverflow的所有其他问题都没有答案,这些答案不能指示如何获取用户的当前用户角色,或者没有在此域模型下指定实现。

1 个答案:

答案 0 :(得分:0)

自从您标记了之后,我将为您展示一个可能的表格设计:

CREATE TABLE users (
   user_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   ...
);

CREATE TABLE roles (
   role_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   ...
);

CREATE TABLE user_has_role (
   user_id bigint REFERENCES users NOT NULL,
   role_id bigint REFERENCES roles NOT NULL,
   PRIMARY KEY (user_id, role_id)
);

CREATE TABLE current_role (
   user_id bigint PRIMARY KEY REFERENCES users,
   role_id NOT NULL,
   FOREIGN KEY (user_id, role_id) REFERENCES user_has_role
);

前三个表包含静态信息,第四个表在用户登录时进行更新。