多层数据库开发一:设计数据库应用程序

                                          第一章 设计数据库应用程序

  数据库应用程序允许用户与存储在数据库中的信息进行交互。数据库提供了信息的结构,供不同的应用程序共享。
  Delphi 4支持关系型数据库。关系型数据库以行和列即表格的形式来组织信息。当您设计一个数据库应用程序的时候,必须了解数据的结构,这样才能设计出一个合适的用户界面来显示数据库中的数据并且允许用户输入新的数据或者修改已有的数据。
1.1 使用
   数据库构件选项板的“Data Access”页上的构件用于读写数据库,这些构件都借助于BDE(Borland Database Engine)来访问数据库中的信息。
   Delphi 4的不同版本所包含的数据库驱动程序有所不同。不过,所有的版本都包含了访问本地数据库的驱动程序,而Client/Server版本和Enterprise版本还 包含了SQL Links用于访问远程数据库。究竟使用本地数据库还是远程数据库取决于几个方面的因素,例如,表格中要存储多少数据,有多少用户要同时访问数据库,对数据库的性能有什么要求。
1.1.1 本地数据库和远程数据库
   本地数据库位于本地磁盘或局域网上。如果有几个用户同时访问数据库,本地数据库采取基于文件的锁定策略,因此,本地数据库又叫基于文件的数据库。
   正因为本地数据库往往与数据库应用程序在同一个系统中,因此,访问本地数据库的速度比访问远程数据库的速度要快。
   本地数据库所能存储的数据没有远程数据库所能存储的数据多,在选择使用本地数据库还是远程数据库时必须考虑到这一点。
   使用本地数据库的应用程序也称为单层应用程序,因为数据库和应用程序在同一个文件系统中。
   典型的本地数据库有Paradox、dBASE、FoxPro和Access。
   远程数据库通常位于远程计算机上,用户通过SQL(Structured QueryLanguage)来访问远程数据库中的数据,正是基于这个原因,远程数据库有时候也叫SQL服务器或者叫RDBMS(Remote Database Management System)。
   远程数据库非常适合于几个用户同时访问,与那些基于文件锁定策略的本地数据库不同的是,远程数据库提供了基于事务的多用户支持。
   远程数据库所能存储的数据也比本地数据库多得多,甚至有时候数据并不 在一个服务器上,而是分布在几个服务器上。
   使用远程数据库的应用程序称为两层或多层应用程序,因为数据库和应用程序位于彼此不依赖的系统(层)中。
   典型的SQL服务器有Interbase、Oracle、Sybase、Informix、Microsoft SQLServer和DB2。
1.1.2 数据库的安全性
   数据库往往包含了一些敏感信息。为了保护这些信息,不同的数据库有不同的保护策略。有的数据库如Paradox和dBASE,仅仅在表格级或字段级提供了安全保护,当一个用户试图访问受保护的表格时,他必须输入口令。当口令被认可,他只能看到允许的字段。
   大部分SQL服务器需要用户输入用户名和口令,一旦用户成功地登录到服务器,他所能看到的表格以及能进行的操作与他输入的用户名和口令有关。
   当您设计一个数据库应用程序的时候,必须考虑到数据库服务器需要什么样的安全措施。例如,如果不想让用户输入口令,您要么使用不需要口令的数据库,要么在程序中就把用户名和口令提供好,不过,在程序中提供用户名和口令容易泄密。
   如果需要用户输入口令,还必须考虑什么时候输入口令。如果正在使用一个本地数据库但希望将来能够平滑地过渡到一个大型的SQL数据库,最好在打开一个表之前提示用户输入口令,尽管现在还可能用不着口令。
  有的服务器可能需要多重口令,为了简化用户的操作,可以只要求用户输入一个主口令,其余的口令由程序自动提供。
   在多层的Client/Server应用程序中,可能要同时用到不同的安全模式,例如,用CORBA或MTS控制访问中间层,再让中间层去处理登录到远程数据库的细节。
1.1.3 事务
   一个事务实际上是一组动作,这些动作必须在一个或几个表被提交之前成功地执行。如果有某个动作执行失败,所有的动作都将滚回(Undo)。
   大部分本地数据库不支持事务,但BDE驱动程序还是提供了有限的事务处理能力。而SQL数据库和ODBC兼容的数据库本身就提供了处理事务的能力。
1.1.4 数据字典
   不管使用本地数据库还是远程数据库,应用程序都有权访问数据字典。数据字典提供了一个可自定义的不依赖于应用程序的存储区域,在这个区域中,可以创建扩展的字段属性集和描述数据的内容和外观。
   例如,如果要经常开发财务软件,可以创建几个特殊的字段属性集,以不同的格式显示金额。当在设计期创建数据集时,就不需要用对象观察器手工设置金额字段的显示格式,只要从数据字典中选择一个合适的属性集,让当前数据集中的金额字段共享它的属性。使用数据字典能保证数据具有一致的外观。
   在Client/Server环境下,数据字典可以位于远程服务器上。
位于...DELPHI4/LIB目录中的DRINTF单元提供了访问数据字典的编程接口。
1.1.5 完整性验证、存储过程和触发器
   所有的关系数据库都提供了存储和操作数据的功能。此外,有些数据库还提供了有助于保证数据完整的功能。
   一是完整性验证。这个功能提供了一种机制,能够防止两个表之间的Master/Detail关系被打断。当用户试图删除Master表中的一个字段时,如果这个字段被删掉将导致Detail表中出现孤立的记录,完整性验证功能要么不允许删除这个字段,要么把孤立的记录删掉。
   二是存储过程。存储过程实际上是一组SQL语句,它们放在SQL服务器上,这些SQL语句能够执行与数据库相关的任务,然后返回执行结果(记录集)。三是触发器。触发器也是一组SQL语句,这些语句将在响应某个命令时被触发执行。
1.2 数据库应用程序的体系结构
   一个数据库应用程序在逻辑上通常由两部分组成:一是数据库访问链路,二是用户界面,这就是数据库应用程序的体系结构。
1.2.1 选择合适的体系结构
   建议最好把实现数据访问链路的构件与实现用户界面的构件分开,凡是数据访问构件最好放在数据模块上,这样能够保证应用程序具有一致的用户界面。如果把设计好的数据模块和窗体加到对象库中,在创建一个新的数据库应用程序时就不必什么都从头开始,这样不但能够提高编程效率,而且能够保证程序具有一致的风格。
   数据库应用程序的体系结构取决于是使用本地数据库还是远程数据库,取决于同时访问数据库的用户数以及数据库中需要存储哪些类型的信息。
   如果数据库中的信息不需要在几个用户之间共享,建议使用本地数据库,可以获得较快的访问速度,而且不必购买昂贵的服务器。不过,本地数据库所能存储的数据容量是有限的。
   如果需要存储很多的信息,最好改用远程数据库。不过,两层的体系结构需要SQL Links的支持,而SQL Links只有Delphi 4的Client/Server和Enterprise版本中才包含有。
   如果表与表之间的信息存在着比较复杂的关系,或者用户的数量增加了,建议您考虑多层的体系结构。与两层的应用程序相比。多层的应用程序多了一个中间层,中间层用于集中处理应用逻辑,这样,不同用途的客户程序可以使用相同的数据并且保证数据逻辑是一致的。同时,客户程序可以做得比较小巧,因为相当大的一部分工作由中间层去做了,这就是所谓的“瘦”客户。“瘦”客户更容易安装、配置和维护,因为它不需要包含数据库访问链路,不需要BDE。用多层的体系结构还有个好处是,可以把数据处理的任务分布在几个不同的系统中完成。当然,只有Client/Server和Enterprise版本才支持多层的体系结构。
   不过,层数越多,开发难度和费用就越大,因此,开发数据库应用程序时,最好先从单层开始,随着数据和用户的增加,再逐步平滑地过渡到多层体系结构。这里的关键是,一开始就要考虑到体系结构的可伸缩性,以最大限度地重用代码,使用以前的投资。
1.2.2 可伸缩性
   BDE的结构以及数据模块的使用使可伸缩性成为可能。不管是单层、两层还是多层,都可以把用户界面与数据访问链路分开,如图1.1所示
  其中,窗体主要用于实现用户界面,它的主要部件是数据控件。数据模块主要用于实现数据访问链路,换句话说,就是引入数据集。数据集与数据控件之间通过TDataSource构件连接。把用户界面与数据访问链路分开的好处是,当应用程序以后过渡到多层体系结构时,只有数据模块上的数据集构件需要修改,而用户界面不需要变动。
   不过,有的用户界面可能需要相应地变动,例如,不同的数据库有不同的安全策略,有的数据库要求登录,而有的数据库可能不需要登录。
   BDE本身就具有可伸缩性,要把一个基于BDE的单层应用程序过渡到两层应用程序,这非常简单,只要修改数据集连接一个SQL服务器就行了。
   要把一个基于TClientDataSet构件的单层应用程序过渡到多层应用程序,也是非常容易的,因为TClientDataSet 同时支持从文件中存取数据和通过IProvider接口存取数据。
   如果计划过渡到三层的体系结构,可以先按单层或两层设计,除了要把用户界面分开外,还要把应用逻辑分开,因为应用逻辑最终要放到中间层即应用服务器上。在设计用户界面时,可以暂时用本地数据库提供数据,以后再改用TClientDataSet获取数据。
  图1.2 单层数据库应用程序的体系结构
1.2.3 单层的数据库应用程序
   在单层的数据库应用程序中,应用程序和数据库共享同一个文件系统,它们使用本地数据库或文件来存取数据。
   一个单层的数据库应用程序同时包含了用户界面和数据访问机制(可能是通过BDE,也可能是通过文件)。图1.2是单层数据库应用程序的体系结构。可以看出,既可以通过基于BDE的数据集构件从本地数据库中获取数据,也可以通过TClientDataSet构件从文件中获取数据。有一个共同点是,它们都通过TDataSource构件向用户界面提供数据。
1.2.4 两层的数据库应用程序
   在两层的数据库应用程序中,客户程序提供用户界面,通过BDE从远程数据库服务器获取数据。图1.3是两层数据库应用程序的体系结构。
   图1.3 两层数据库应用程序的体系结构
   在这种模式下,所有的应用程序都是客户,客户通过BDE与远程数据库服务器交换数据。一个服务器可以同时处理许多客户的请求,协调访问并且更新数据。
1.2.5 多层的数据库应用程序
   在多层的数据库应用程序中,客户程序、应用服务器和远程服务器分布在不同的机器上。其中,客户程序主要提供用户界面,它能够向应用服务器请求数据和申请更新数据。再由应用服务器(又叫Remote Data Broker)向远程数据库服务器请求数据和申请更新数据。图1.4是多层数据库应用程序的体系结构。
   图1.4 多层数据库应用程序的体系结构
   Delphi 4既可以创建客户程序,也可以创建应用服务器。客户程序通过IProvider接口与应用服务器通讯,通讯的协议可以是TCP/IP、DCOM、MTS或 CORBA。通讯协议与客户程序上的MIDAS连接构件有关,也与应用服务器上的数据模块有关。
   应用服务器通过IProvider接口有几种方式。如果应用服务器上包含TDataSetProvider构件或TProvider构件,IProvider接口将由这两个构件提供。如果应用服务器上没有TDataSetProvider构件和TProvider构件,IProvider接口由基于BDE的数据集构件提供。用TDataSetProvider构件或TProvider构件提供IProvider接口的好处是可以对IProvider接口进行控制。不过,不管哪种情况,IProvider接口都能在客户程序与应用服务器之间传递数据。
   在多层模式下,几个客户有可能同时与一个应用服务器通讯,应用服务器实际上充当了一个网关的作用。
1.3 设计用户界面
   构件选项板的“Data Controls”页上的构件(也叫数据控件)用于显示数据库的数据,并且让用户编辑数据并保存到数据库中。数据控件构成了数据库应用程序的用户界面(UI)。
   数据控件通过TDataSource构件与数据库连接,TDataSource构件就好像用户界面与数据库之间的导管。在同一个窗体上,几个数据控件可以连接到同一个TDataSource构件,这几个数据控件能够保持同步,因为数据控件总是显示当前记录的数据。TDataSource构件一般放在数据模块上,与用户界面分开。
   数据控件有好几种,使用哪个数据控件取决于要显示的数据的类型,也取决于怎样组织这些信息、怎样让用户浏览信息和怎样让用户编辑数据的方式。
1.3.1 显示单条记录和多条记录
   很多情况下,在同一个时刻应用程序只需要显示一条记录即当前记录的数据,事实上,构件选项板上的数据控件大多数是为显示当前记录的数据而设计的,如TDBText构件。
   如果要同时显示多条记录,就要用TDBGrid构件或TDBCtrlGrid构件。这两个构件既可以显示多条记录,也可以显示多个字段。
   两个表之间可以建立Master/Detail关系,相应地,客户程序可以用一个TDBText构件显示Master表的某个字段,用一个TDBGrid构件显示Detail表的多条记录。
1.3.2 分析数据
   有些数据库应用程序并不是直接把数据库中的原始数据显示给用户,而是对数据进行分析、统计后以一种恰当的方式显示出来,这样能够帮助用户从中得出结论。
   构件选项板的“Data Controls”页上有一个TDBChart构件,这个构件能够以图表的形式对数据进行分析和显示。如果您购买的是Delphi 4的Client/Server版本,构件选项板上将有“Decision Cube”页。这一页上的构件能够对数据进行多维分析和统计,并以栅格和图表的形式显示出来。
1.3.3 选择要显示的数据
   一个数据库应用程序往往只关心数据库中的一部分数据,比如,有的程序只关心一部分字段,而有的程序只关心一部分记录。
   至于怎样取出关心的数据,这取决于您使用的数据集构件。一个数据库应用程序中可能使用了几个数据集构件。Delphi 4支持六种类型的数据集。
   TTable构件。在逻辑上代表一个表。可以通过创建永久字段对象来调整字段的外观,可以增加Lookup字段和计算字段,可以设置过滤条件和范围来选择记录。
   TQuery构件。可以对数据库进行查询,并返回符合条件的记录。
   TStoredProc构件。用于执行SQL服务器上的存储过程。存储过程也可以返回符合特定条件的记录。
   TClientDataSet构件。能够从应用服务器检索数据,在本地内存中复制一个副本。正是基于这个原因,TClientDataSet能同时工作的记录数是有限的。用TClientDataSet 建立的客户程序可以做得很小,因为它不需要依赖于BDE,只需要DBClient.DLL文件。TClientDataSet既可以从应用服务器取得数据,也可以从文件中取得数据。
   TNestedTable构件。用于访问嵌套表中的记录。尽管Delphi 4不能直接创建Oracle8类型的表,但是可以显示和编辑嵌套表中的数据。
  自定义的数据集构件。它是从TDataSet继承下来的,与上述标准的数据集构件不同的是,自定义的数据集构件得自己解释记录缓冲区中的内容。对于自定义的数据集来说,仍然可以使用字段编辑器,也可以使用标准的数据控件显示数据。

时间: 2024-08-03 09:57:25

多层数据库开发一:设计数据库应用程序的相关文章

多层数据库开发九:查询数据库

                                                        第九章 查询数据库 这一章介绍如何用TQuery构件查询数据库,如何通过SQL语句检索.插入.更新和删除数据.SQL是符合工业标准的关系数据库语言,既可以用于远程的基于服务器的数据库,如Sybase.Oracle.InterBase和Microsoft SQL Server,也可以用于本地数据库如Paradox.dBASE.FoxPro和Access以及符合ODBC的数据库.9.1 有

避开十大错误 找到数据库开发捷径

尽管软件发展中的热点技术层出不穷,不断地变化,有一些东西却一直未曾改变,其中之一就是开发人员对数据库的使用和设计开发-- 你可能会兴奋地紧跟时尚创建一个AJAX Web界面,或者使用最近迷人的Windows用户界面,但是透过这些各种各样的外观界面,你可能依然需要从后台数据库中提取或存取所需要的数据--这一点就如同十多年以前人们对数据库的操作是一样的. 然而,令人吃惊的是,现在还有很多开发者依然在不断地重复着很多年以前就存在的数据库使用和开发上的错误.或许是有太多的开发者只是来学习如何使用一个数据

大型MIS软件的开发必须重视数据库设计

80年代初以来,国内许多计算机专家先后深入一些大型企业,力图开发出理想的大型MIS.实践证明,开发出的大型MIS,多数不很理想.原因何在?据作者一孔之见,其中一条重要的原因,就是在开发过程中对MIS的数据库设计重视不够,没有把它当作一件头等大事来处理.一个大型MIS,如果它的数据库设计出了问题,就是出了大问题,或者说从根本上出了问题.这样的MIS,不会成功,只会失败.既然如此,应该怎样来解决它呢? 一.MIS的基础是数据库 MIS系统包括硬件和软件两部分.MIS的软件,是由文档加程序组成的.它的

多层数据库开发八:访 问 表 格

                                                  第八章 访 问 表 格 这一章介绍怎样在数据库应用程序中使用TTable构件.TTable的上级是TDBDataSet,而TDBDataSet是从TBDEDataSet继承下来的,TBDEDataSet又是从TDataSet继承下来的.因此,如果对第六章的内容完全掌握了的话,您应该对TTable构件不感到陌生.8.1 使用TTable构件的一般步骤 TTable构件可以访问数据库表格中的每一行和每

数据库设计-数据库开发,根据用户喜好推送内容。

问题描述 数据库开发,根据用户喜好推送内容. 文章-->类型 为 一对多: 用户-->喜爱类型 也为 一对多: 比如 文章A 它的类型为 科技 体育 文学 文章B它的类型为 数学 体育 英语 文章C它的类型为 科技 地理 历史 用户喜欢 科技类 与 历史类的文章.我要做个,你<喜欢的文章>栏目 数据库该怎么设计. 也就是说 有很多文章 每篇可能有多个标签 每个用户可以喜欢多个标签的文章 我想根据不同用户各自喜欢的标签 推送文章.数据库怎么写好...

使用Weka和IBM BLU纵列数据库开发一个数据挖掘应用程序

本文将了解如何使用 Weka 统计分析工具和 IBM BLU 纵列数据库来开发一个数据挖掘应用程序.Codename: BlueMix 是 一款 beta 级产品,随着我们不断让其功能更加完善和更易于使用,它也将不断改进.我们会竭尽全力保持本文最新,但并不总是完全跟得上现状.感谢大家的理解! 作为一家无线服务供应商公司的客户分析小组中的数据科学家,我们想利用客户数据来预测客户流失情况.对于电信行业来说,客户保留是一个重大挑战,在该行业中,客户年度流失率高达 40%.如果我们可以预测哪些客户存在流

C#winform程序,需要录入分秒毫秒数据到SQLserver数据库,请问界面和数据库分别怎么设计

问题描述 C#winform程序,需要录入分秒毫秒数据到SQLserver数据库,请问界面和数据库分别怎么设计 做一个管理运动员百米冲刺成绩和3000米成绩的winform程序,想录入分,秒,毫秒数据到SQLserver数据库. 问题1,什么控件支持录入分秒毫秒数据?或者用输入框的话什么格式能准确的录入到数据库中? 问题2,数据库用什么数据类型?可以方便的实现排序,就是按照时间长短排名,不需要年月日,只需要分,秒,毫秒.连小时都不需要,因为3000米跑下来也就是十几分钟的事情.而百米冲刺又要求有

安卓服务端开发编程和数据库设计

问题描述 安卓服务端开发编程和数据库设计 安卓服务端开发.我现在在开发一个安卓APP,类似与记事本,现在想实现云端备份的功能,不知道服务端该怎么做,用PHP,还是Jsp/severlet?这两个都不怎么熟悉,Java有基础会不会上手快一点.另外数据库设计方面问个白痴的问题,改用那种模式:A用户表+数据表这两个表.B用户表+每个用户的数据表. 解决方案 1.PHP.JSP都可以,看你熟悉哪一个. 2.优先 A用户表+数据表这两个表 这个方案,可通过中间表进行关联. 再提供一个服务端与android

c/s基于数据库的开发,是不是和单机程序一样。

问题描述 c/s基于数据库的开发,是不是和单机程序一样.只是数据连接的是局域网上的服务器的sqlserver,而不是本机的sqlserver?连接上了,就和单机的开发一样了? 解决方案 解决方案二:如果是直连数据库没啥区别解决方案三:还有不是直连数据库的?解决方案四:引用2楼gzlaspnet的回复: 还有不是直连数据库的? 所谓的单机就是数据库和运行程序在同一台电脑上,脱离的这个条件就不能称之为单机...解决方案五:c/s跟那个没什么关系吧你本机用的就是单机通过服务器访问的就是C/s啊解决方案