ORM(O/R Mappping对象关系映射)的基础概念
在我们的系统中,存 在大量的需要进行持久化存储的对象,这些对象可能是各种各样的业务单据,也 可能是我们的系统配置信息等。另外一些属于内存中使用而不需要进行持久化存 储的对象,不属于我们的讨论范围。而在支持对象序列化的语言比如C#,Java中 ,我们可以将这些对象序列化到磁盘文件或者直接保存到关系数据库中。其中关 系数据库是我们最主要也是最安全的选择。
在对数据库中的业务数据进 行各种操作的时候我们发现,我们进行的大量的Insert、Update、Delete操作, 除了其SQL语句根据不同的对象有不同的变换之外,其主要流程存在很多相似之 处。于是人们就想通过一个东西来实现这些相同部分的操作的自动化,而那些不 同的流程,操作再做特殊处理。这样我们就可以把主要的精力都集中在那些个性 化的,特殊的流程操作上。这就是ORM产生的根本原因。
在Java的世界里 ,ORM框架的应用比较早,也比较成熟,比如Hibernate等,而在.NET世界里,起 步就相对晚的多。但是由于担心使用开源的ORM框架导致项目更为复杂(因为这 些开源工具虽然很好,但是各个项目总是存在自己特殊的地方。所以目前不敢用 )。但是我们确可以自己设计开发些小型的,尽量符合自己项目的ORM。
可是不论怎么样,我们都需要对ORM有一定的了解:
一、对象的继承结构 :
在支持OO的语言中,继承是最重要的概念之一,所以我们的ORM也应该 对继承作出相应的支持。一般来说,对于ORM世界中的继承有三种模式:
1、一个继承树映射到一个表(ONE_INHERITANCE_TREE_ONE_TABLE):
即将具有相同父类的所有类都映射到一个表中,这些类属性映射的并集 组成了这个表的所有列,在这种情况下,只需要对最底层的类进行映射。如下面 一个类结构:
在上面的类结构中,父类有属性Property1和Property2,而子类 Child1有属性Property3,子类Child2有属性Property4。
所以如果采用 ONE_INHERITANCE_TREE_ONE_TABLE映射模式的话,数据库中只有一张表。
类属性 | 数据库表字段 |
Property1 | Field1 |
Property2< /td> | Field2 |
Property3 | Field3 |
Property4 | Field4 |
但是这种模式存在大量 的属于冗余,对于Child1,由于没有Property4属性,所以字段Field4是冗余字 段。同样,对于Child2,Field3是冗余字段。但是这种模式的优点的简单。