首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从ER方式到OOP方式的转换

从ER方式到OOP方式的转换
EN

Stack Overflow用户
提问于 2012-07-11 09:27:27
回答 2查看 167关注 0票数 0

从传统的以E图数据库为中心的方法来设计应用程序,使用OO方法实现类会引起混乱,如下面的示例所示

1)实现多到多关系的类。

假设您有两个实体,即教授和学院,它们具有以下关系(我不知道如何绘制,否则我会用图表说明示例):

  • 一位教授可以在不同的学院以不同的身份工作,如讲师、客座讲师、实验室助理、研究员等。
  • 一所学院可能/将有许多教授在不同的职位上工作,如讲师、客座讲师、实验室助理、研究员等。

用ER的方式,我们会有这样的桌子

CollegeTable (CollegeId,CollegeName) ProfessorTable (ProfessorId,ProfessorName) LecturerTable (LecturerId,CollegeId,ProfessorId,Timings)

因此,多到多关系是一个包含实体和其他关系特定数据的主键的表。如果我必须创建类来表示表中的行,它们将类似于

代码语言:javascript
运行
复制
class CollegeData
{
    string CollegeId;
    string CollegeName;
}

class ProfessorData
{
    string ProfessorId;
    string ProfessorName;
}

class LecturerData
{
    string CollegeId;
    string ProfessorId;
    DateTime Timings;
}

但是,在OOP和将实体映射到类中做同样的事情,我们将有如下所示

代码语言:javascript
运行
复制
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的方式

代码语言:javascript
运行
复制
class DeanData
{
    string DeanId;
    int DeanExp;
}

class CollegeData
{
    string CollegeId;
    string CollegeName;
    string DeanId;
}

,同时以OOP的方式进行

代码语言:javascript
运行
复制
class Dean
{
    string DeanId;
    int DeanExp;    
}

class College
{
    string CollegeId;
    string CollegeName;
    Dean aDean; 
}

在保存或加载数据时,也存在将OO对象与其表结构表示形式映射到关系数据库中的问题。有什么办法可以做到以上的正确的OO方式,但没有“冗余”?或者,这是一种惩罚,支付的事情,以OO的方式?

EN

回答 2

Stack Overflow用户

发布于 2012-07-11 12:47:00

在你看来,这个问题实际上比你描述的要糟糕一些,因为你所说的“正确的OO方式”实际上应该在一对多的关系的一端有反向引用。

例如,您的学院-讲师-教授模型应该更像这样:

代码语言:javascript
运行
复制
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可以进行大量基于适当设计的关系数据库构建对象的繁重工作。

票数 2
EN

Stack Overflow用户

发布于 2012-07-11 14:28:32

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

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

DDD &多到多对象关系映射

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11429563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档