从传统的以E图数据库为中心的方法来设计应用程序,使用OO方法实现类会引起混乱,如下面的示例所示
1)实现多到多关系的类。
假设您有两个实体,即教授和学院,它们具有以下关系(我不知道如何绘制,否则我会用图表说明示例):
用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)实现一对一关系的类。
扩展上面的示例,假设我们有一个具有以下约束的Dean实体(为了简单起见,假设Dean不是一个教授)
再一次我们会用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方式,但没有“冗余”?或者,这是一种惩罚,支付的事情,以OO的方式?
发布于 2012-07-11 12:47:00
在你看来,这个问题实际上比你描述的要糟糕一些,因为你所说的“正确的OO方式”实际上应该在一对多的关系的一端有反向引用。
例如,您的学院-讲师-教授模型应该更像这样:
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框架来自动创建对象。ORMs可以进行大量基于适当设计的关系数据库构建对象的繁重工作。
发布于 2012-07-11 14:28:32
如果您的目标是设计您的模型基于DDD原则,那么您不希望双向关联在您的模型。
Udi Dahan写了一篇关于这个主题的很好的博客文章,我建议您阅读:
DDD &多到多对象关系映射
https://stackoverflow.com/questions/11429563
复制相似问题