来自传统的 ER 图以数据库为中心的方法来设计应用程序,使用 OO 方法实现类会导致混淆,如下面的示例所示
1) 实现多对多关系的类。
假设您有两个实体,Professor 和 College,具有以下关系(我不知道如何绘制 SO,否则我会用图表说明示例):
- 一位教授可能在不同的学院以不同的身份工作,例如讲师、客座讲师、实验室助理、研究员等。
- 一所大学可能/将有许多教授担任不同职位,如讲师、客座讲师、实验室助理、研究员等。
以 ER 方式执行此操作,我们将拥有这样的表格
CollegeTable (CollegeId, CollegeName)
ProfessorTable (ProfessorId, ProfessorName))
LecturerTable (LecturerId, CollegeId, ProfessorId, Timings))
因此,多对多关系是一个包含实体主键和其他关系特定数据的表。如果我必须创建类来表示我的表的行,它们会像
class CollegeData
{
string CollegeId;
string CollegeName;
}
class ProfessorData
{
string ProfessorId;
string ProfessorName;
}
class LecturerData
{
string CollegeId;
string ProfessorId;
DateTime Timings;
}
但是在 OOP 中做同样的事情并将实体映射到类,我们将有如下
class College
{
string CollegeId;
string CollegeName;
}
class Professor
{
string ProfessorId;
string ProfessorName;
}
class Lecturer
{
College aCollege;
Professor aProfessor;
DateTime Timings;
}
所以现在做正确的 OO 方式会在系统上引入更多负载,因为现在我们在多对多类中创建完整的类对象,而不是只有 ID 字段。当我们说讲师添加/编辑页面时,请考虑这个含义,我们可以在其中编辑计时或更改教授。我们不需要完整的教授或学院对象(因为它们将有自己的母版页用于添加/编辑),只需要它们的 ID。
2) 实现一对一关系的类。
扩展上面的例子,假设我们有一个具有以下约束的院长实体(为简单起见,假设院长不是教授)
- 一所学院可以有一位院长,一个人只能在一所学院担任院长。
我们将再次采用 ER 方式
class DeanData
{
string DeanId;
int DeanExp;
}
class CollegeData
{
string CollegeId;
string CollegeName;
string DeanId;
}
,同时以 OOP 方式进行
class Dean
{
string DeanId;
int DeanExp;
}
class College
{
string CollegeId;
string CollegeName;
Dean aDean;
}
在保存或加载数据时,将 OO 对象与其表结构表示映射到关系数据库中也存在问题。有没有什么办法可以以正确的面向对象的方式完成上述操作,但没有“冗余”?或者这是以 OO 方式做事的惩罚?