【问题标题】:Modeling circular depedencies循环依赖建模
【发布时间】:2018-06-02 00:57:01
【问题描述】:

我正在尝试对学生和课程之间的关系进行建模。以下是我需要支持的 2 个高级查询:

  • 查找学生注册的所有课程
  • 查找已注册课程的所有学生。

这种关系是 M:N 关系(多对多,即多个学生注册多个课程)。

如何根据 java 对象对它们进行建模。直觉上,Student 和 Course 似乎相互引用,创建循环依赖(或反向引用)。

class Student{ 
 Long id
 String name
 List<Course> enrolledCourses;
 Long rollNumber
}

Course{
 Long id
 String name
 List<Student> enrolledStudents;
}

以上述方式对此类需求进行建模是否正确。

我有点犹豫要不要创建这样的循环依赖关系,但不知道如何建模它。

  • 上面的方法是否正确?
  • 或者是否有更好的方法来模拟这些行为?

【问题讨论】:

  • 您正在使用/遵循什么数据建模方法/教科书?

标签: java data-modeling


【解决方案1】:

如果我对您的理解正确,您会有点害怕冗余。如果学生 X 访问课程 Y,则学生的课程列表中有课程 Y,课程的学生列表中有学生 X。

如果您注意修改方法,这可能是模拟这种情况的最佳方法。 但是,如果您害怕最终让学生访问他不参加的课程(根据课程),您将不得不像在关系数据库中那样做,并创建一个关系对象。

现在,如果您对这种情况进行更多思考,那么这次课程访问可能会有很多事情要讲。学生何时参观课程?他做过什么考试吗?结果如何?哪位教授主持了这门课程?分析完之后,你会对情况有一个更好的了解。

我的方法通常是先彻底分析情况。然后我分析我对数据的操作。最后我开始考虑我的数据的最佳表示。

【讨论】:

    【解决方案2】:

    这在 Java 中是没有问题的,而且是正确的方法。双射关系,经常在两个方向上使用。在 JPA 中,他们通常会得到一个注释来懒惰地获取它们。

    事实上,使用 JPA 注释建模可以让您表达主键、多对一等。

    我个人更喜欢long rollNumber,而不是可以为空的Long rollNumber

    当然并不总是明智的做法,尤其是当实体处于从属地位时。

    【讨论】:

      猜你喜欢
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2017-10-27
      • 2021-09-18
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多