我正在构建一个应用程序,该应用程序允许每个用户选择他们是否要注册为播放器,还可以选择注册为管理员。他们可以同时注册为玩家和管理员,但只能拥有一个当前角色->即,在给定时间只能以任一玩家/管理员身份登录。
我正在使用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的所有其他问题都没有答案,这些答案不能指示如何获取用户的当前用户角色,或者没有在此域模型下指定实现。
答案 0 :(得分:0)
自从您标记了database-design之后,我将为您展示一个可能的表格设计:
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
);
前三个表包含静态信息,第四个表在用户登录时进行更新。