ORM基础概念

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=481

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 Field2
Property3 Field3
Property4 Field4
但是这种模式存在大量的属于冗余,对于Child1,由于没有Property4属性,所以字段Field4是冗余字段。同样,对于Child2,Field3是冗余字段。但是这种模式的优点的简单。
2、一个继承路径映射到一个表(ONE_INHERITANCE_PATH_ONE_TABLE):
同样一上面的类结构,数据库中将存在两张表,分别对应于Child1和Child2.
Child1对应的数据库表:
类属性 数据库表字段
Property1 Field1
Property2 Field2
Property3 Field3
Child2对应的数据库表
类属性 数据库表字段
Property1 Field1
Property2 Field2
Property4 Field4
这种模式的优点是没有数据冗余,但是缺点也是很明显的,那就是,当我们想根据Parent来查找满足Parent的Child1和Child2的时候,就必须同时对两张数据库表进行查找,当继承数横向很大的时候,这种查找将导致大量的性能下降。
3、一个类映射到一个表(ONE_CLASS_ONE_TABLE):
对于上面的类结构,对于的数据库表如下。

这种模式下,每个类对应于一个数据库表,其中字表和父表通过ID进行关联。当然这种方式的优点是数据冗余小,但是缺点是,当继承关系很复杂的时候,我们构造SQL也会变得相当复杂,从而导致修改变的也很复杂。效率也会降低。当然了,如果一个类没有父类也没有子类哪么上面三种模式都是一样。
二、对象的组合结构:
对象的组合结构是指一个对象中包含若干不同类型的子对象,比如人(Person)对象包含了手(Hand)对象,头(Head)对象等。这些都是ORM应该考虑的问题。
三、对象状态:
对象一般包括如下几个状态:
1、还没有和任何数据库数据关联的对象,比如刚new出来的对象,此时对象中没有任何实际数据。
2、对象初始化并且设置了属性值,但是还没有被保存,此时需要使用ORM的Insert功能。
3、从数据库中读取出来的数据对象,并且已经修改,此时对象对应于数据库中某条记录。
4、数据库中记录已经被删除了的对象。
上面几种状态需要在我们的ORM中能有所体现。比如对于第一种状态,我们需要对其设置属性值,然后转换成第二种状态。在ORM中执行Insert操作。对于第三中状态,我们需要执行Update操作,第四种状态我们应该进行错误提示。
四、ORM中的事物处理:
事物处理是每个底层框架都应该考虑的问题,即使不能提供自有的事物处理模型,至少也要能够提供能够进行事物处理的接口等。
.NET中事物处理有两种方式,一种是使用COM+,通过使用TransactionScop来实现事物处理,这种方式性能有一定的下降,但是整个代码显得非常优美。另外一种方式是通过SqlTransaction来实现事物处理。由于我曾经被COM+弄的很惨,所以我这里推荐使用SqlTransaction。
五、O/R Mapping的一般做法:
要实现对象和关系之间的映射,我们需要定义映射规则,也就是类的属性和数据库表字段之间的一一对应规则。比如上面所说的Child1.Property3对应数据库表中的Field3字段。在.NET中我们可以通过自定义Attribute来实现。好像也能够通过配置文件来描述映射规则,但是我这里仅仅讨论的是Attribute的形式。

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
http://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=481

原文地址:https://blog.51cto.com/14036626/2484087

时间: 2024-11-10 14:31:05

ORM基础概念的相关文章

ORM的概念, ORM到底是什么

一.ORM简介         对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中.那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法.         这种方案存在以下不足:         1.持久化层缺乏弹性.一旦出现业务需求的变更,就必须修改持久化

ORM原型概念

http://www.cnblogs.com/chenkai/archive/2011/01/06/1929040.html ORM[Object-Relation-Mapping]对象关系映射. 这个名词已经出来好几年了.已经不陌生.  以前在项目中针对相对复杂业务逻辑时一般采用领域模型驱动方式进行业务概述,分析和建模. 其中在设计阶段我第一次接触ORM这个概念.  针对实际项目中ORM 采用的是Nhibernate实现底层数据持久化.  当然现在ORM成熟的工具已经很多了. 本篇的目的结合以

关系型数据库常用基础概念知识归纳

声明:我的文章都是只挑主要的写,次要细节太多,归纳就没意义了,同时归纳主要是给自己看的, 而且基本都是凭自己的一些记忆和理解即时写的.不一定对和全(但大多是一些需要理解的概念),请各位看管见谅! 数据库设计篇 1.范式 A.1范式,原子性,即列不可分 B.2范式,完全依赖,即有个主键唯一区分 C.3范式,不能传递依赖,即表中不能还有其他表的非主键信息 2.模型 A.概念模型,即ER图等 B.逻辑模型,即建逻辑表 C.物理模型,即生成物理表 事务 1.四大特性, A.原子,要么..要么.. B.隔

分布式学习——基础概念篇

概述 最近这段时间一直在看分布式有关的东西,但是关于分布式自己还是不能很好的理解,所以本文对分布式基础概念进行下学习. 分布式处理 首先先了解一下分布式处理,分布式处理和集中式处理正好是相反的的体系架构,集中传输集中到式处理顾名思义就是将所有的信息都一个统一的信息中心进行处理:分布式处理就是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机利用通信网络连接起来,让各个计算机各自承担同一个工作任务的不同部分,在控制中心的管理下,同时运行,共同完成同一个工作任务. 提到分布式处理就不能不提到

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留

.NET进阶——ORM基础认识

ORM对象关系映射,对象即实体,关系即关系数据库表,ORM即实现从实体对象关系数据库数据的映射.本质上就是将数据从一种形式转换到另一种形式.它具体又有哪些表现呢,咱们一步步学习,一步步分析. ORM解决了什么问题? 想想以前使用的三层开发,在D层对数据库的操作基本可以归纳为以下几点问题: 1.使用DataSet/DataTable填充返回数据. DataSet的结构就相当于一张表,使用DataSet ,需要取得某一数据时是必须要知道表结构的(列名或者列的序号),这不仅违反了三层分层的思想,也不符

js基础--javascript基础概念之数组(二)

js基础--javascript基础概念之数组 数组栈方法 数组可以像栈一样.栈是一种先进后出的数据结构,最先添加的数据最后一个出来.栈方法添加数据也称为 推入  移除数据称为 弹出. js为数值栈方法提供了 push()   和  pop() ;  两个方法. push() push() 方法接受参数就是你要添加进入到数组的值.push()  方法会将他们逐一添加到数组的末尾  数组的length属性会跟着更新数据. *push(多个数组元素值) 返回的修改后的数组长度 var array =

js基础--javascript基础概念之数组

js基础--javascript基础概念之数组 在ECMAScript 中 ,数组是很常用的数据类型,js中的数组和其他很多语言的数组有明显的区别.js的数组可以保持任何类型的数值,一个数组中可以保存着多个不同类型的数值.js数组大小(长度)是可以调整的.可以随着数据的添加自动增长数组长度. 创建数组: 一.数组字面量 数组字面量由一对包含数组项的方括号[]表示. var array = [ 'kin', 'cheong', 'change', 'hello', 'haha', 'hi' ];

Linux基础概念-----环境变量

Shell 环境变量 Shell也是应用程序,工作与用户模式 变量类型 整形 浮点型 字符型 布尔型 bash变量类型 本地变量:仅对当前Shell有效 局部变量:仅对局部代码段有效(函数) 环境变量:expor VAR_NAME=Value,对当前Shell及子Shell有效 位置变量:$1;$2 .... 特殊变量:$?;$!;$$ .... 查看环境变量 printenv export 查看所有变量 set bash的引号 双引号:弱引用,可以实现变量替换: 单引号:强引用,不替换,而显示