我对(精神上)连接数据库和面向对象编程感到困惑。
想象一下教师的成绩簿应用程序,例如,用户界面显示学生在表格中的行和列中的作业。底层数据库可能包含多对多关系:学生有很多作业,作业有很多学生。
底层代码如何工作?您是否有一个带有引用分配列表的变量的Student类?或者是一个带有引用学生列表的变量的Assignment类?都? ...您是否有某种StudentAssignment类链接学生和作业的实例? (并且,如果是这样,这是否意味着一个有50名学生和10个作业的班级同时有500个StudentAssignment对象,50个学生对象和10个Assignment对象在内存中?!)......然后这些不同的类主要包括(对于示例)使用底层数据库的SQL语句?
我知道这里有很多问题,但它们都在一起......编码多对多关系的普遍接受的策略是什么?
P.S。只是因为你不认为我在偷懒,我 看了其他问题,比如How to model a Many to many-relationship in code?和Modelling a manyToMany relationship with attributes。
答案 0 :(得分:3)
在数据库中,您需要学生表,分配表和StudentAssignment的交集表。 OOP的表示可能只是每个学生都有他们的作业集合。你需要看看学生有什么特定的任务吗?如果这样做,则无论如何都要在Assignment对象上填充该信息。或者,您也可以检查每个学生是否有特定的任务。这取决于您。
数据库在如何使用OOP语言表示和访问数据方面存在局限性。
但你绝对不需要StudentAssignment对象。该表表达了一种关系,而不是一种实体。
编辑:
如果您需要从作业转到具有该作业的学生,以及从学生到作业的所有作业,您将需要50个学生对象和10个作业对象。在创建这些对象时,您可能希望使用关联对象填充每个对象上的集合(学生将具有列表分配,反之亦然)。
假设您这样做了:
为所有学生创建对象(返回50条记录),将其Assignments集合设置为emty列表。
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),但他们的关系将由每个对象的作业或学生的集合定义。
答案 1 :(得分:1)
您的困惑是可以理解的,将SQL模式转换为OO通常会让人感到困惑,因为它们是不同的范例。
如果您认为OO提供了一种抽象底层实现的方法,那么您将有一个更清晰的答案路径。为每个SQL表创建一个对象,无论在清晰度还是更好的抽象层方面都没有任何好处。
您是否有一个带有引用列表的变量的Student类 分配?或者带有引用列表的变量的Assignment类 学生的?既?
我可能会同时执行这两项操作,具体取决于数据访问模式。
您是否有某种StudentAssignment类链接学生和作业的实例?
不,这不是必需的。在Student
和Assignment
类中隐藏此实施细节。
然后这些各种类主要由(例如)SQL组成 使用底层数据库的语句?
他们可以,而且往往会在现实生活中,但你也可以让他们调用实际访问数据的其他类,例如,使用存储库模式。