注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Lucifer 的博客

网易英超评论专栏

 
 
 

日志

 
 
 
 

Linq To Sql对于多表继承的支持  

2007-12-17 16:04:47|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

不止一个客户问过关于LINQ对于实体,table的继承的支持,例如数据库中有用户表和驾驶员表驾驶表继承用户表,结果发现在OR Desinger中无法实现两表的继承关系。一旦将其继承后,其映射关系将会失去。再例如用户定义了一张表来封装业务规则,把其定义为实体类,然后通过派生类来简单的扩展一些属性,结果发现再用linq来从数据库生成扩展后的实体类的时候,程序报错。不管是OR Desinger以后是基于命令行的SqlMetal对于这类继承关系的支持都不是很好。

 

提一下表的继承机制,DB表单的相互继承和映射关系是ORM当中很常见的一种逻辑关系。

 

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

 

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java或者.NET程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式,其本身就是一种中间件。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。比如Hibernate就是一个流行的ORM 产品

一般来言,ORM中存在的继承机制大约有以下几种。

 

1. 单表继承体系

所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据。单表继承体系适合那种继承体系中实体数目相对较少,总记录数相对较少,子类对父类的属性扩展也相对较少的情形。比如在用户表当中定义一个标识字段,1标识驾驶员,2标识医生等等,然后通过具体的这个标识字段来生成不同的派生类,比如驾驶员类和医生类。这是当前的LINQ TO SQL能够支持的。 

单表继承体系优点是读/写继承体系中的每个实体的数据,都只需操作一张表,性能较好,并且,新增继承类,或扩展实体属性都只需要增减一张表的字段就可以了,易于维护;主要缺点是,因为所有的实体共享一张表,表中会有比较多的NULL字段值的数据,浪费了一些存储空间,同时,如果记录数过多,表就会更庞大,也会影响表的读写性能。 

2. 一实体一具体表

所谓一实体一具体表就是每个实体对应一张数据表,并且,每个数据表冗余包含其父类的所有属性字段,并且,子类和父类共享相同的主键值。一实一具体表方案适合需要较高查询性能,继承体系层次不太复杂,并且基类包含较少的属性而子类扩展较多属性,并且能够承受一定的数据库空间浪费的情况。 

一实体一具体表方案的优点主要就是查询性能好,读操作只需操作一张表,和实体数据的对应结构清晰,数据库表迁移和维护会比较方便;主要的缺点是数据冗余较大,因为每次插入一条子类数据时,同时要插入一份子类包含的父类字段的数据到所有父类层次表中。  

3. 一实体一扩展表

所谓一实体一扩展表是指继承体系中的每个实体对应一张数据表,但是,每个子类不冗余包含父类的所有属性,而只是包含扩展的属性和共享的主键值。一实体一扩展表方案适合继承体系非常复杂,结构易变,并希望最大程度减少数据冗余的情形。 

一实体一扩展表方案的优点是结构灵活,新增子类或插入中间的继承类都很方便,冗余数据最少;但是缺点是,无论读还是写操作都会涉及到子类和所有的父类。读操作时,必须自然链接查询所有的父类对应的数据表,而插入或更新数据时,也需要写所有的父类表。 

这是因为就目前而言,LINQ TO SQL并不支持多表继承,包括一实体一具体表的继承体制和一实体一扩展表的继承体制。LINQ TO SQL只支持单表的继承,即用一张数据库表存储整个继承体系中所有实体的数据。如果想实现比单表继承更复杂的映射关系,也许LINQ TO Entities对于这个问题将会是一个比较好的解决方案

 

 

本文关于ORM模型继承的内容参考自

http://www.cnblogs.com/teddyma/archive/2006/08/14/inheritencemappinginorm.html

 

 

 

 

  评论这张
 
阅读(878)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017