热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

定制数据层_sqlserver

定制数据层关键字:数据层,访问,元数据,数据访问模型http://www.gaodaima.com/35448.html定制数据层_sqlserver

定制数据层

关键字:数据层,访问,元数据,数据访问模型

http://www.gaodaima.com/35448.html定制数据层_sqlserver

撰写:●⌒●┒ [email protected] 引用请注明出处

时间:2003年8月

摘要:在一个分层的系统中,数据层承担的任务是为系统提供需要的数据。在承上启下的过程中,系统的变更,尤其是系统数据要求的变更会让数据层忙的不亦乐乎。为此在痛苦的变更之后,我选择了数据访问模型,将元数据引入到数据层。使之有极强的扩展能力,变更能力。本文就将介绍一个基本无需编程的数据层。

如果您使用的是小系统或已经决定使用快速绑定数据库表。本文可能对您不太合适。

 

概念的提出

在一个稍有规模的系统中,目前一般会使用分层的设计。数据层的概念由此产生,为系统提供必须的数据,屏蔽数据存取,使用简单易用的接口实现数据操作。它将实现Create,Read,Update,Delete(CRUD)的操作来提供给上层……等等。

数据是一个软件系统的核心。绝大多数的数据保存在商业数据库中,一般无需我们为此添油加醋。数据层则是系统与数据库打交道的一个,也应该是唯一的一个地方。

然而,系统的变更几乎无法避免。用户现场提出,需求变更等等几乎无法完全避免。同时一个开发好的系统也可能需要使用不同的数据库。变既然无法避免,不如积极面对。引入数据访问模型使得变更在数据层不用更改代码,甚至一个数据层组件可以适应不同的系统。也就是说--数据层的编程工作量几乎已经没有。

 

数据层模型

上图是一个部署模型。如图:数据层被分成了数据提供层和数据访问层,和一个数据访问元数据。下面分别介绍这四个文件的作用:
数据访问元数据:
描述数据的存取方法的数据,为系统的每一个存取数据逻辑提供描述,并使用数据访问点命名此访问逻辑,元数据存于数据库中。
通用数据访问层:
是一个组件,管理数据库驱动、屏蔽数据库差别、为上层提供简单一致的接口执行调用。
通用数据提供组件:
使用通用数据访问层执行数据的CRUD操作,使用数据访问元数据控制数据调用指令。
专用数据提供组件:
如果数据访问元数据构建的数据访问模型构建得不充分,需要此组件提供必要的功能补充。

数据访问模型

此模型由数据访问元数据来描述,因此元数据的定义需要功力。一方面:数据访问元数据越完备,通用数据提供组件功能就越强。兼容性也越好,但另一方面,模型比较细腻会让通用数据提供组件的编程比较复杂,因此需要权衡。

在一定的权衡后,我给出了如下的定义,下列定义已经足以满足一般的需要:

它将存在两部分。数据库和本地缓存。

数据库中保存在数据访问元数据表DataaccessMeta。
本地缓存包含DataAccessMeta表的缓存,还有数据库的架构信息,包括,数据库中有什么表,表中有几个字段,表中字段的属性,表间的约束关系等。
列名域说明IDInt(not NULL)主键、唯一标识符,默认自增1QueryNameVarchar(128)(not NULL) 唯一,数据访问点名称,即应用层的调用的传入参数TypeInt(not NULL)保留 访问类别,默认0,ReturnTypeInt(not NULL)0:多个数据表表示一个数据集(默认)1:由多表合成一个表的数据集(动态视图)TransactionInt(not NULL)0:不需要事务支持 (默认)1:需要事务支持SQLVarchar(512)存储SQL语句,[email protected]rchar(64)存储过程名称ViewVarchar(64)视图名称Table_1Varchar(32)表名FieldName_1Varchar(256)Table_1字段名(指定要访问的字段)空,将返回表中所有字段。Table_2Varchar(32)表名FieldName_2Varchar(256) Table_2字段名(指定要访问的字段)空,将返回表中所有字段。Table_3Varchar(32)表名FieldName_3Varchar(256)Table_3字段名(指定要访问的字段)空,将返回表中所有字段。Table_4Varchar(32)表名FieldName_4Varchar(256)Table_4字段名(指定要访问的字段)空,将返回表中所有字段。Table_5Varchar(32)表名FieldName_5Varchar(256)Table_5字段名(指定要访问的字段)空,将返回表中所有字段Table_6Varchar(32)表名FieldName_6Varchar(256)Table_6字段名(指定要访问的字段)空,将返回表中所有字段
说明:
QueryName为数据存取逻辑的别名。上层通过此别名来调用相应元数据 表中优先级从上到下(对于允许为空的字段,但它存在时,忽略其他。)比如SQL字段存在,将忽略StoreProcedure及以下字段。 在从表读数据时从Table_1读到Table_6,保存时倒序。 SQL字段内容可以以传入入参数方式表示,如”select * from table where [email protected]”即为一个合法的命令文本,[email protected] 当ReturnType 为1时(把多表合成一表),各表之间必须要有且只有一个外键关联,查找关系的优先级从Table_1 到 Table_6。表连接也是相同顺序,因此注意表的先后关系 此外,数据库中必须还要有一张版本表来判别元数据的版本问题。

本地缓存主要为了效率。至少包含三部分,上面的数据访问元数据缓存,数据库的架构缓存,版本缓存,即至少3个文件。

 

通用数据访问层

设计原则:
简化data access logic component中对数据库的操作。 数据存取进行集中处理,有利屏蔽数据库之间的差别。管理数据源。管理数据库的认证。管理事务性的操作。管理数据库连接。

应提供的接口有:
SetConnectPropety() //设置连接属性 SetDBType() //设置数据库类型,比如oracle,SQL Server ExecSQL()//执行SQL语句,注意需要根据数据库类型解析成对应的语句。 Update()//将数据集写入数据库 Transactiong() //控制事务处理的相关函数 GetDBTableName()//得到数据库中的所有表名 GetDBForeignKey()//得到数据库中的所有外键关系
 

通用数据提供组件

设计原则:
仅返回需要的数据。 为不同的调用提供一致接口。 为输入输出参数提供简单的映射和转换。使上层不用关心数据存储。 暴露元数据的接口。查询参数,结果集的描述等。 处理一个主表和相关联的表。 执行优化操作和锁定等数据库操作。 缓存数据和非事务性的查询结果。 在使用分布式或多数据库的系统下,提供动态的数据库路由。 不要为每个事务提供数据库的事务支持,节约数据库资源。 不应该初始化有交集的事务,因为可能会出现多处同时更新的情况,引发矛盾。 不要在各个方法调用时维持状态。 不要为每个表设计一个数据访问点,应该为每个系统数据需求提供。 本组件奉行一个原则,”系统不应当知道数据从何而来,但程序员应该非常熟悉。”
内部对象:
元数据管理类:负责元数据的更新,缓存,读取,管理元数据内存缓冲,对效率的要求极高。 数据提供类:负责解析数据访问元数据,并将解析结果传入数据访问层。
应提供的接口有:

SetConnectPropety() //设置连接属性 GetDataSet(strAccessPoint,strFilter,strField)//获得数据集。其中strAccessPoint为数据访问点名称 Update() //把数据集更新到数据库 GetAccessPoint()//得到所有的数据访问点名称 GetFields(strAccessPoint) //得到每个数据访问点可以获得的字段名 GetFieldProperty(strAccessPoint,strFieldName) //得到每个字段的属性
工作过程:

1.检测元数据和数据库版本。如更新,下载到本地。
2.将元数据,数据库架构读入内存,(约1张表1k的数据量)。
3.等待查询。
4.查询时解析元数据,构造需要的SQL语句。
5.将SQL传入数据访问层。
6.得到数据。
7.根据元数据将表间约束填入数据集。
8.返回数据,等待查询。

结语:
元数据的使用。致使效率上有所降低。所以并不适合对效率要求极高的系统。

我使用ADO.NET构造了一个本文所描述的数据层。两人发了5周的时间编码。应用良好。觉得对大家也许有些帮助。特撰写此文与大家共勉。

元数据的使用其实并不仅限于数据层,如若把界面,功能元数据结合,大家可以想象将会出现什么结果,只不过数据层的元数据容易归纳而已。

本组件在 http://www.csdn.net/cnshare/soft/19/19227.shtm 已经发布。

欢迎大家阅读《定制数据层_sqlserver》,跪求各位点评,若觉得好的话请收藏本文,by



推荐阅读
  • 在Oracle数据库中,使用Dbms_Output.Put_Line进行输出调试时,若单行字符超过255个,则会遇到ORA-20000错误。本文介绍了一种有效的方法来处理这种情况,通过创建自定义包和视图,实现对长字符串的分割和正确输出。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本文由杨勇和思远于2012年12月27日撰写,主要探讨了如何使用PHP进行网页内容抓取,特别是针对字符较多的网站。文章详细介绍了正则表达式失效的原因,并提供了优化方法,同时展示了如何抓取淘宝服饰栏、天气信息以及IP地址对应的地理位置。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 本文详细介绍了在使用 SmartUpload 组件进行文件上传时,如何正确配置和查找文件保存路径。通过具体的代码示例和步骤说明,帮助开发者快速解决上传路径配置的问题。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 本文介绍了一个SQL Server自定义函数,用于从字符串中提取仅包含数字和小数点的子串。该函数通过循环删除非数字字符来实现,并附带创建测试表、存储过程以演示其应用。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
author-avatar
天王2502871933
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有