【发布时间】:2019-10-15 17:22:39
【问题描述】:
背景: 我正在构建一个 Web 应用程序,允许教师使用许多分析功能对学生进行测验,以帮助衡量个人/班级在测试/测验中的表现。目前,我正在重新设计 MySQL DB Schema,您可以看到我迄今为止构建的基本 EEF 图:
我实际上是在使用 Hibernate 来创建从后端到数据库的连接,但是这个 EEF 图在显示表之间的关系方面做得很好。
问题 我目前为 Admins、Student 和 Teachers 设置了单独的表,因为这三个表都将具有唯一的字段,尽管目前它们具有非常相似的字段。拥有 3 个不同的表的问题是我希望教师和学生共享一些功能。例如,教师应该能够像学生一样参加测验(出于测试目的)。 我的第一直觉是创建一个学生和教师都扩展的用户类:
public class User{
...
}
@Entity
@Table(name="student")
public class Student extends User{
...
}
@Entity
@Table(name="teacher")
public class Teacher extends User{
...
}
这种方法完成了我想做的测验服务:
public QuizInstance takeQuiz(User u, QuizStructure struct){
...
}
但我不确定在涉及多态性时如何创建映射关系。这个问题的一个很好的例子是 registerUser 服务:
public void registerUser(User u, String password) {
if(u instanceof Teacher) {
//register User into Teacher Table..
}else if(u instanceof Student) {
//register User into Student Table...
}
new LoginService().createLogin(u, password);
}
public class LoginService{
...
public void createLogin(User u, String password){
Login l = new Login();
l.setEncrPass(encrypt(password));
l.setEmail(u.getEmail());
if(u instanceof Teacher)
l.setRole("teacher");
else
l.setRole("student");
l.setUser(u);
//Save Login into Login Table in DB
}
}
@Entity
@Table(name="login")
public class Login {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id", unique=true, nullable=false)
private int id;
@Column(name="email", nullable=false)
private String email;
@Column(name="encrypted_pass", nullable=false)
private String encryptedPass;
@Column(name="role", nullable=false)
private String role;
//How do I map User if it can link to either the Teacher table or the Student Table???
private User user;
}
我质疑这是否是解决问题的最佳方法。我不禁动摇我的 DB Schema 的设计是一个问题,安全性和结构方面。有人可以告诉我我构建的数据库架构是否工艺不佳,如果是,请分享一些示例/资源,以更好地帮助说明更安全的数据库架构。
【问题讨论】:
标签: java mysql hibernate inheritance architecture