我正在构建一个市场应用程序。我正在设计应用程序。我有两种三种类型的用户:
admin:执行管理任务的用户 禁用帐户、向用户添加信息、启用帐户、向用户发送消息...
卖家:在网站中创建产品并出售的用户 创建产品、编辑产品、停用产品、更改价格
买家:购买产品的用户
所以它是用户: A-有自己的权利(允许做什么) B-有他自己的信息。卖家将有产品列表,而买家将有交易列表。
我使用 Spring Security 框架管理用户身份验证和授权。我的应用程序是用 Java/Hibernate/Spring/AngularJS/Bootstrap 开发的。 我可以使用 Spring security 管理权限。这不是问题。
我的问题是关于用户信息的。最好有一个下表:
@Entity
@Table(name = "T_USER")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Inheritance(strategy=InheritanceType.JOINED)
public class User extends AbstractAuditingEntity implements Serializable {
@NotNull
@Size(min = 0, max = 50)
@Id
@Column(length = 50)
private String login;
@JsonIgnore
@Size(min = 0, max = 100)
@Column(length = 100)
private String password;
@Size(min = 0, max = 50)
@Column(name = "first_name", length = 50)
private String firstName;
@Size(min = 0, max = 50)
@Column(name = "last_name", length = 50)
private String lastName;
@Email
@Size(min = 0, max = 100)
@Column(length = 100)
private String email;
//others attributes,getters and setters
}
子类
@Entity
@Table(name = "T_ADMIN")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Admin extends extends User{
// specific informations
}
@Entity
@Table(name = "T_SELLER")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Seller extends extends User{
// specific informations
}
@Entity
@Table(name = "T_BUYER")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Buyer extends User{
// specific informations
}
用户通过身份验证后,我可以使用以下 userServiceDetails 添加特定于用户类型的信息:
public class UserDetailServiceImpl implements UserDetailsService {
private UserDAO userdao;
public void setUserdao(UserDAO userdao) {
this.userdao = userdao;
}
// this class is used by spring controller to authenticate and authorize
// user
@Override
public UserDetails loadUserByUsername(String userId)
throws UsernameNotFoundException {
com.model.User u;
try {
u = userdao.get(userId);
if (u == null)
throw new UsernameNotFoundException("user name not found");
} catch (DAOException e) {
throw new UsernameNotFoundException("database error ");
}
return buildUserFromUserEntity(u);
}
private User buildUserFromUserEntity(com.model.User userEntity) {
// convert model user to spring security user
String username = userEntity.getUserId();
String password = userEntity.getPassword();
boolean enabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
GrantedAuthority[] authorities = user.getAuthorities();
User user = null;
if(authorities[0].getName.equals("ROLE_ADMIN"){
user = new Admin(username, password, enabled,
accountNonExpired, credentialsNonExpired, accountNonLocked,
authorities);
// set admin informations
}
else if(authorities[0].getName.equals("ROLE_SELLER"){
user = new Seller(username, password, enabled,
accountNonExpired, credentialsNonExpired, accountNonLocked,
authorities);
// set seller informations
}
else if(authorities[0].getName.equals("ROLE_BUYER"){
user = new Buyer(username, password, enabled,
accountNonExpired, credentialsNonExpired, accountNonLocked,
authorities);
// set buyer informations
}
return user;
}
}
我想知道我的关于用户层次结构的数据库设计是否良好?
最佳答案
我想说的是继续实现它。
我唯一可以建议的是,如果您要对卖家和买家进行查询,如果将它们拆分到不同的表而不是一个表中,查询会快很多。
关于java - 我的数据库设计好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27657294/