4

我对(精神上)连接数据库和面向对象的编程感到困惑。

例如,想象一个教师的成绩簿应用程序,其 UI 在表格的行中显示学生,在列中显示作业。底层数据库可能包含多对多关系:一个学生有很多作业,而一个作业有很多学生。

底层代码如何工作?您是否有一个带有引用作业列表的变量的 Student 类?还是带有引用学生列表的变量的作业类?两个都?...您是否有某种 StudentAssignment 类链接 Student 和 Assignment 的实例?(如果是这样,这是否意味着一个有 50 个学生和 10 个作业的班级同时在内存中有 500 个 StudentAssignment 对象、50 个 Student 对象和 10 个 Assignment 对象?!)......然后这些不同的类主要由(对于例如)使用底层数据库的 SQL 语句?

我知道这里有很多问题,但它们都在一起......编码多对多关系的普遍接受的策略是什么?

ps 只是为了让您不认为我很懒惰,我确实看过其他问题,例如如何在代码中建模多对多关系?建模 manyToMany 与 attributes 的关系

4

2 回答 2

3

在数据库中,您需要一个 Student 表、一个 Assignment 表和一个 StudentAssignment 的交集表。对此的 OOP 表示可能只是每个学生都有自己的作业集合。您需要查看哪些学生有特定的作业吗?如果你这样做了,那么一定要在 Assignment 对象上填充该信息。或者,您也可以检查每个学生是否有特定的作业。这取决于您。

数据库在数据的表示和访问方式方面存在限制,而您不一定在 OOP 语言中具有这些限制。

不过,您绝对不需要 StudentAssignment 对象。该表表示关系,而不是实体。

编辑:

如果您需要从作业到拥有该作业的学生,​​以及从学生到他们的所有作业,您将需要 50 个学生对象和 10 个作业对象。当您创建这些对象时,您可能希望用它们的关联对象填充每个对象上的集合(学生将有一个列表分配,反之亦然)。

假设你这样做了:

为所有学生创建对象(这将返回 50 条记录),将他们的作业集合设置为一个空列表。

SELECT
    StudentName,
    ID
FROM
    Student

为您的所有作业创建对象(这将返回 10 条记录),将他们的学生集合设置为一个空列表。

SELECT
    AssignmentName,
    ID
FROM
    Assignment

假设您使用以下内容查询所有数据:(假设每个学生都有每个作业,这将返回 500 条记录)

SELECT
    Student.ID [StudentID],
    Assignment.ID [AssignmentID]
FROM 
    Student
    INNER JOIN StudentAssignment ON Student.ID = StudentAssignment.StudentID
    INNER JOIN Assignment ON Assignment.ID = StudentAssignment.AssignmentID

您可能希望遍历这 500 条记录,为每个关系添加相应的对象。您仍然只有这 60 个对象 (50 + 10),但它们的关系将由每个对象具有的作业或学生的集合定义。

于 2012-04-19T16:21:20.573 回答
1

您的困惑是可以理解的,将 SQL 模式转换为 OO 通常会令人困惑,因为它们是不同的范例。

如果您认为 OO 提供了一种抽象底层实现的方法,那么您将有一个更清晰的答案路径。为每个 SQL 表创建一个对象在清晰度或更好的抽象层方面确实没有任何好处。

您是否有一个带有引用作业列表的变量的 Student 类?还是带有引用学生列表的变量的作业类?两个都?

我可能会同时做这两个,这取决于数据访问模式。

您是否有某种 StudentAssignment 类链接 Student 和 Assignment 的实例?

不,这不是必需的。Student在你的和Assignment类中隐藏这个实现细节。

然后这些不同的类是否主要由(例如)与底层数据库一起使用的 SQL 语句组成?

他们可以,而且在现实生活中经常会这样做,但您也可以让他们调用其他实际访问数据的类,例如,使用存储库模式。

于 2012-04-19T16:19:52.040 回答