【问题标题】:Is my database design is good?我的数据库设计好吗?
【发布时间】:2015-02-23 18:36:47
【问题描述】:

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

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

  2. seller : 在网站上创建产品并销售的用户 创建产品、编辑产品、停用产品、更改价格

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

所以它是用户: A-有自己的权利(允许做什么) B-有他自己的信息。卖方将拥有产品清单,而买方将拥有交易清单。

我使用 Spring Security Framework 管理用户身份验证和授权。我的应用程序是用 Java / Hibernate / Spring / AngularJS / Bootstrap 开发的。 我可以使用 Spring 安全性管理权限。这不是问题。

我的问题是关于用户信息的。有下表更好吗:

@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 angularjs spring hibernate spring-security


    【解决方案1】:

    我不知道你的应用程序的规格,所以它可能是完全正确的,但你的设计不允许用户同时成为卖家和买家。

    我认为,如果您只有一个用户表,并且在登录时为该用户编写一个角色列表,那么一个用户可以有多个角色,每个角色都有他们的信息和关系,这将更加灵活。

    【讨论】:

    • 今天,不要求卖家同时也是买家。但如您所知,它将被要求成为一项要求。我想我必须实施它。如果我这样做,我必须更改我的用户模型。所以在这种情况下,用户表必须是唯一的。我真的不知道如何管理特定于每个角色的信息
    • 如果您预见到这是一项要求,最好做好准备 :) 您可以为每个角色创建一个类,其中包含角色的数据和行为,并将其与用户相关联你的控制器。
    • 是的,但你能给我一些想法,在这种情况下如何管理与角色相关的信息吗?
    • 在您的控制器上,您可以执行if(authorities[0].getName.equals("ROLE_ADMIN"){ AdminRole adminRole = adminDao.getRoleFor(userId); user.addRole(adminRole); } 您有一个用于存储必要信息的每个角色的表。当用户登录时,您会加载她的所有角色。
    【解决方案2】:

    我会说继续实施它。

    我唯一可以建议的是,如果您正在与卖方和买方进行查询,如果您将它们分成不同的表而不是一个表,查询将会快得多。

    【讨论】:

    • 感谢您的回答。我可以对卖家或买家提出具体要求。我想让网站尽可能简单。我将为卖家和买家提供一个独特的登录表单。因此,在获取数据库之前,我无法知道它是卖家还是买家。当我获取数据库时,我会重定向到买家或卖家主页。
    • 在这种情况下,随它去吧。如果您打算稍后做其他事情,您可以随时更改您的桌子。