0

来自传统的 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 方式做事的惩罚?

4

2 回答 2

2

如您所见,问题实际上比您描述的要糟糕一些,因为您称之为“正确的 OO 方式”实际上应该在一对多关系的一端具有反向引用。

例如,您的 College-Lecturer-Professor 模型应该更像这样:

class College 
{ 
    string CollegeId; 
    string CollegeName; 
    List<Lecturer> aLecturers;  // <=NOTE THIS
} 

class Professor 
{ 
    string ProfessorId; 
    string ProfessorName;
    List<Lecturer> aLecturers;  // <=NOTE THIS
} 

class Lecturer 
{ 
    College aCollege; 
    Professor aProfessor; 
    DateTime Timings; 
} 

当您观察到这会产生开销时,您是对的,因为您的数据库仅包含整数外键值的成熟对象。

重要的区别是您不应该将存储在 DBMS 中的所有数据同时加载到对象层次结构中。

从编码的角度来看,很多人喜欢使用 ORM 框架来自动创建对象。ORM 可以消除大量基于适当设计的关系数据库构建对象的繁重工作。

于 2012-07-11T12:47:00.850 回答
1

如果您的目标是基于 DDD 原则设计模型,那么您不希望模型中存在双向关联。

Udi Dahan 就这个主题写了一篇很好的博客文章,我建议您阅读:

DDD 和多对多对象关系映射

于 2012-07-11T14:28:32.230 回答