Java 数据库模式导师和学员关系及it';使用JPA的s表示

Java 数据库模式导师和学员关系及it';使用JPA的s表示,java,jpa,database-design,relational-database,database-schema,Java,Jpa,Database Design,Relational Database,Database Schema,我正试图为我想要创建的系统找到一个合适的数据库模式 该系统供用户注册课程,并允许那些有导师的用户监控其学员注册的课程的状态。导师可以是学员,学员也可以是导师,每个学员只有一个导师,每个导师可以有0个或更多学员 我想到的是让系统中的所有用户都有一个用户表,每个用户都有一个唯一的键,然后是两个表,mentor和mentee,它们包含映射到用户表的外键,具体取决于它们是mentor还是mentee,或者两者都是。在学员表中,另一列是导师id的外键,在导师表中,另一列是该导师下的学员id列表 现在对于J

我正试图为我想要创建的系统找到一个合适的数据库模式

该系统供用户注册课程,并允许那些有导师的用户监控其学员注册的课程的状态。导师可以是学员,学员也可以是导师,每个学员只有一个导师,每个导师可以有0个或更多学员

我想到的是让系统中的所有用户都有一个用户表,每个用户都有一个唯一的键,然后是两个表,mentor和mentee,它们包含映射到用户表的外键,具体取决于它们是mentor还是mentee,或者两者都是。在学员表中,另一列是导师id的外键,在导师表中,另一列是该导师下的学员id列表

现在对于JPA,我不知道如何创建这些关系,甚至不知道我目前对模式的想法是否合法。一件事是创建一个用户实体,并拥有一个导师和学员实体,该实体是用户实体的子类。我相信JPA将为每个实体创建一个单独的表


如果您能帮助我开发模式和实体,我将不胜感激。

对象模型的设计最终将取决于您在应用程序中使用对象的方式;但这是一个合理的开端:

我倾向于将继承作为对任何设计问题的第一反应;因此,我建议创建两个类,
Mentor
Mentee
,每个类都与
@OneToOne
用户有关系,并且它们之间有明显的关系。例如:

@Entity
public class User {
    @Id
    private int id;

    private String name;
    ...
}

@Entity
public class Mentee {
    @Id
    private int id;

    @OneToOne
    @JoinColumn(name="USER_ID")
    private User user;

    @ManyToOne
    @JoinColumn(name="MENTOR_ID")
    private Mentor mentor;
    ...
}

@Entity
public class Mentor {
    @Id
    private int id;

    @OneToOne
    @JoinColumn(name="USER_ID")
    private User user;

    @OneToMany(mappedBy="mentor")
    private Collection<Mentee> mentees;
    ...
}

你知道如果在JPA中我让实体扩展用户实体,并且只有用户实体有ID,会生成什么样的模式吗?我想这取决于你使用的JPA实现(例如Hibernate)。我不太喜欢模式(或实体)生成。JPA的一个主要优点是它允许您在映射的两侧都有很大的灵活性;因此,您可以更恰当地建模对象和关系。
USER
    ID : INT (primary key)
    NAME : STRING

MENTEE
    ID : INT (primary key)
    USER_ID : INT (foreign key to USER)
    MENTOR_ID : INT (foreign key to MENTOR)

MENTOR
    ID : INT (primary key)
    USER_ID : INT (foreign key to USER)