谁应该建立这种关系?实体或数据映射器?

时间:2010-01-04 18:06:21

标签: design-patterns architecture orm datamapper

有四个类:

StudentBase CourseBase StudentDataMapper CourseDataMapper

Student对象可以与Course对象建立关系。一个学生可以有很多课程。许多学生可以参观一门课程。

在ER图中,学生实体有一个名为“课程”的属性,但课程对他的学生一无所知。课程没有属于“学生”的属性作为回报。

这些类中的哪一个应该执行关系的创建?

编辑:这是系统层!在业务逻辑层中,开发人员将StudentBase和CourseBase子类化,以创建Student类和Course类。创建这些类的开发人员将看不到任何代码,除了他自己的业务逻辑代码。

3 个答案:

答案 0 :(得分:5)

都不是。

首先,ERD应该改变;你所描述的是多对多的关系(一门课程可以有很多学生和一个学生很多课程)。因此,学生不应该有课程属性,而应该有一个学生课程实体。

然后应该有一个StudentCourseDataMapper类来完成你所要求的(维护关系),StudentDataMapper和CourseDataMapper都应该知道并使用它。

答案 1 :(得分:0)

如果我理解你的问题,我不能100%确定。

例如,NHibernate(它是一个对象关系映射器)试图尽可能不影响您的业务代码。

因此,ORM不应管理您的关系。它应该在存储时使用它,并在从数据库加载时将其重新创建为其原始状态。

如果课程对学生一无所知,则无法管理这种关系。

因此,根据您对情况的描述,学生是可以管理关系的最自然的地方。

答案 2 :(得分:0)

要回答关于哪个人应该管理关系的问题,答案可能是学生,课程或两者。

您如何看待这些课程的使用?如果始终从“课程”角度使用它们,则需要添加管理关系的学生属性。相反,如果他们总是从学生的角度使用,那么显然就是它所处的位置。

然而,如果考虑到你所谈论的数据类型,它似乎是最可能的答案,那么它属于两个地方。