java - 我的数据库设计好吗?

标签 java angularjs spring hibernate spring-security

我正在构建一个市场应用程序。我正在设计应用程序。我有两种三种类型的用户:

  1. admin:执行管理任务的用户 禁用帐户、向用户添加信息、启用帐户、向用户发送消息...

  2. 卖家:在网站中创建产品并出售的用户 创建产品、编辑产品、停用产品、更改价格

  3. 买家:购买产品的用户

所以它是用户: 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/

相关文章:

java - 在 jenkinsx Minikube 中更改 _JAVA_OPTIONS

java - 无法启动 glassfish 服务器,因为无法获取/opt/glassfishv3/glassfish/domains/domain1/logs/server.log 的锁定

java - 如何检查客户端网络/防火墙的端口是否打开?

java - 将 DynamoDB 与 Spring Boot 结合使用时出现错误请求 (404)

css - 如何在离散条形图条上放置 MouseOver 事件

javascript - 将函数变量与数组循环进行比较

javascript - 如何在 forEach 之后运行 lastTask

java - hibernate : How to get last n rows in spring boot JpaRepository?

java - Hibernate - 如何检索已为 L2 缓存配置的所有实体类的列表

Spring 侦探 |创建全新的(分离的/孤立的)Trace