悟透delphi 第十一章 面向对象数据库基础

   2023-02-09 学习力0
核心提示:本书原著李战(leadzen)大牛,由tingsking18整理,本人blog发布的版本经过战哥同意,转载请著名出处和原作者!第十一章面向对象数据库基础第二节 数据对象的标识我们在关系数据库的设计和开发中,可能经常需要一些唯一的编号或标识,用来作为关键字,以区别每
本书原著李战(leadzen)大牛,由tingsking18整理,本人blog发布的版本经过战哥同意,转载请著名出处和原作者!

第十一章  面向对象数据库基础
第二节 数据对象的标识
我们在关系数据库的设计和开发中,可能经常需要一些唯一的编号或标识,用来作为关键字,以区别每一个不同的人,每一张不同的单据,每一次不同的信息登记,等等。并且,我们也一直采用这些编号和标识,作为关系的连接字段。但是,要保证编号或标识是完全唯一的,却是一个不大不小的难题。
下面我们将详细讨论这一问题,并希望能从另一个高度来理解这一问题。不过,我们首先来看看问题是怎样由来的。现在,给大家讲一个故事。

从前,在北京降生了一个漂亮的小女孩。接生的李阿姨说,她的声音这么大,好象想要全世界的人都听到。
他的父母就为她取了一个很好听的名字,叫“王菲”。于是,所有的小朋友就叫她“王菲”,“王菲”就是她童年的标识。
在她上初二的时候,认识了二班另一个叫“王菲”的同学,而且和她同一天生日。不过,同学们常常将她俩叫错,后来,就分别叫她们“大王菲”和“小王菲”。
在大王菲18岁的那一年,她领到了她的身份证。从此,她有了新的身份标识“100321690808022”,这一标识可以唯一区别***的每一个人。同时,原来二班的“小王菲”也领到了她自己的身份证,“100321690808006”。于是,人们就可以用身份证号,唯一标识两个“王菲”了,虽然谁也不会直接叫她们的身份证号码。
由于她的歌唱的非常好,没多就就成了歌星。歌迷们将“王菲”这一标识与她的歌紧紧地联系在一起。
后来她去了香港发展,并将自己的名称更改为“王靖雯”,同时还领到了香港的身份证,有了香港的身份标识。
没多久,王靖雯和一个弹电吉他的小子相爱了。那小子说,还是“王菲”这个名字好听。后来,“王靖雯”又变回“王菲”了。结果,歌迷们又遇到了麻烦,是将她的歌关联到“王菲”还是“王靖雯”呢,在歌迷中引起一阵混乱。
她和那个弹电吉他的小子结婚了,香港***将他们的身份证号码,用结婚证书关联起来。可是,月老在酒醒之后发现了这一错误,就将关联的记录删除了。
虽然,她和那个弹电吉他的小子分手了,但是,正如接生的李阿姨说的那样,她的声音的确让全世界的人都听到了。

讲完这个故事之后,你应该能领悟到设计数据库的一些哲理。
不管王菲的外部属性和内部属性怎样变化,但王菲还是王菲,不是二班的那个“王菲”。也就是说,王菲的灵魂未变,她是不会改变的,就象哲学上所说的“不以人的意志为转移”。这种唯一表示对象本身的东西,就是对象标识!
对象标识是唯一的。也就是说,即使两个对象,他们的外部属性完全一样,但它们的对象标识是不同的。毕竟,同名同姓甚至同一天出生的大王菲和小王菲是两个不同的人。
对象的标识是永恒不变的。一旦对象产生,它的标识就自然地、唯一地产生了。尽管王菲换了名,身份证号也变过,但王菲的对象标识未变。即使到了下个世纪,她的对象标识也将依然存在于歌迷们的们的心中。
对象的标识是描述关系的基础。王菲唱的歌是王菲唱的,不是初二二班的那个“王菲”唱的。王靖雯唱的歌就是王菲唱的歌,有的歌迷只将歌曲和歌手的人名关联起来,难怪会出混乱。香港***也犯相同的错误,将王菲的身份证号码这一内部属性,跟那个弹电吉他的小子关联起来,也许就是命运的错误。

在关系数据库中,表的每一元组(记录)描述了对象的各个属性。也需要人为地选择某些对象属性字段作为关键字,以标识不同的数据对象。
关系数据库的理论说,一个表中,所有列的值都相同的行,也就是字段都相同的两条记录,描述的是同一数据对象。为了区分属性相同,但对象不同的大王菲和小王菲,就需要引入关键字的概念。于是,大王菲和小王菲都才有了身份证号码。
关系数据库的理论,强行将对象的属性定义为关键字,以区别不同的对象,这才给我们留下了“插入异常”、“修改异常”和“删除异常”,等等,让我们头痛多年的问题。正是因为这一原因,初二的同学才会混淆“王菲”和二班的“王菲”,歌迷们才会搞不清“王靖雯”和“王菲”的关系,这些错误在现实中也是存在的。
其实,对象的标识应该是和对象属性不同的东西,对象的标识才是数据对象的唯一关键字,不以人的意志为转移的。象人的姓名和身份证号是否应该唯一,以及单据编号是否连续等等,是由人们的规则确定的,与人们的意识有关。
那么,到底应该用什么东西来作对象标识呢?
如果,你的数据库只是临时管理初二二班的作业本,用学生姓名作对象标识又未尚不可。如果,你的数据库管理的是***的户口档案,肯定可以用身份证号码作对象标识,不过,身份证号升位之后,你又要辛苦了。
如果,你的数据库要管理整个宇宙的信息,那么,就只能自己产生标识了!
为数据产生唯一的对象标识,一直都没有一个公认的好方法。不过,我们可以作一些有益的探讨。目前,大致有两种方法用于产生对象标识:
一. 增量产生
这种方法就是每次产生对象标识时,到数据库里查找一下最大的对象标识。新的对象标识将在当前最大对象标识基础上增量生成,然后,新的对象标识又成为数据库中的最大对象标识。
这中方法可以保证在一个数据库内可以为每一对象生成唯一标识,并且保存对象标识所用的字节数很少(例如,一个整数)。这种对象标识,在数据库内查询和索引都有较高的效率。
但是,由于这种方法在每次产生对象标识时,需要访问数据库。特别是在多用户使用时,还要采用数据库的事务机制来防止不同用户产生相同标识。因此,产生对象标识的效率很低,特别是在批量产生时。
此外,由于这种方式生成的标识只能保证在某一数据库内是唯一的,不能直接适用于多数据库或分布式数据库环境下。在不同的数据库之间传递或同步相同的数据对象时,需要解决对象标识的转换问题。

二. 随机生成
随机生成对象标识的方法实际就是碰运气,按照某种复杂的随机算法迅速产生对象标识,碰一碰对象标识不重复的运气。只要这种算法产生的对象标识一万年才可能重复一次,那你就可以在实际开发中应用这种算法。
这种方法典型的应用就是COM对象的GUID。虽然,在理论上总有一天会产生重复的GUID标识,但我们等不到那一天,也许那是地球毁灭之后的事情。
首先,这种方法产生对象标识,不需要访问数据库,是在数据库环境之外生成对象标识。因此,标识的生成是一瞬间的事,效率非常高,即使是在批量生成的情况下。
其次,由于在多数据库或分布式数据库环境中的不同地方,也不会产生相同的对象标识,因此,在数据库之间传递或同步数据时将不存在对象标识转换的问题。LOTUS NOTES中的文档管理数据库,就大量采用这一技术。
由于,为了保证有足够的数值空间,供随机算法产生唯一标识,需要用较多的字节存放这一对象标识,将耗费较多的存储空间。GUID是一个长达128位,即16个字节的数据类型,而NOTES的文档标识也是相当长的数据类型。并且,对较大的数据类型进行索引或查找,会花费较大的时间和空间开销,不过,这一问题不向想象的那样严重。

在面向对象的数据库理论中,每一数据都抽象为一个对象,而且,每一对象都应该有一个唯一的对象标识,并且在对象诞生之后永远不便。对象的标识是唯一的关键字,对象的属性是否唯一,是商业逻辑所决定的。对象之间的关系,是通过对象标识的关联来描述的,任何对象属性的改变不会影响对象标识所连接的关系。
…………….

第二节 一个实用的对象标识方案
随机产生对象标识。在实际的数据库编程中,
1. 要有足够的随机空间
2. 要有较高的运行效率
3. 便于阅读理解和查询
INT64许多数据库不支持。
使用double的好处,空间大,有硬件支持运算。
1.00000000000001E-309到9.99999999999999E307
有效位数从1.00000000000000到9.99999999999999
以格林威治时间为对象标识的生成基准,可保证全世界的对象标识生成时间有统一性。使用GetSystemTime函数,与GetLocalTime函数是不一样的。
第三节 面向对象的未来
迷信面向对象技术的程序员相信,世界上的一切东西都可以用类来描述,用对象来建模。诚然,自从有了面向对象的思想之后,原来复杂的数据结构、软件算法变得那么的清晰和简单。面向对象的思想改变了我们对软件的看法。就像当初结构化程序设计思想将人们的思维从错综复杂的算法中解救出来一样,面向对象的思想让我们的思维聚焦在高层次的软件体系设计方面,而不再困惑于软件基本的数据和算法方面。因为,软件基本的数据和算法都封装成为对象而已,而且现在这些对象就象建筑材料一样到处都能找到,有砖,有瓦,有钢精水泥制成的大梁……。在软件产业的飞速发展和不断缔造辉煌的今天,面向对象思想功不可莫。记得大陆开始改革开放时,第一件事就是“解放思想”。由此可见,新的思想在人类进步历程中起着重要的作用。
然而,任何一种思想都有局限性,或者需要不断的发展和完善。从客观上讲,现行的面向对象编程技术已经相当成熟,面向对象的数据库也在发展。但在实际应用开发中,总能碰到难以解决的问题,总能萌发出无法实现的伟大构想。

任何一种技术都不是万能的,追求完美将永远是一种痛苦。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tingsking18/archive/2009/11/05/4772249.aspx
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Delphi中的消息处理机制 delphi 方法
    每一个VCL都有一内在的消息处理机制,其基本点就是构件类接收到某些消息并把它们发送给适当的处理方法,如果没有特定的处理方法,则调用缺省的消息处理句柄。    其中mainwndproc是定义在Twincontrol类中的一个静态方法,不能被重载(Override)。它不直接处
    02-09
  • Delphi XE6 通过JavaScript API调用百度地图
    Delphi XE6 通过JavaScript API调用百度地图
    参考昨天的内容,有朋友还是问如何调用百度地图,也是,谁让咱都在国内呢,没办法,你懂的。 首先去申请个Key,然后看一下百度JavaScript的第一个例子:http://developer.baidu.com/map/jsdemo.htm下一步,就是把例子中的代码,移动TWebBrower中。 unit Unit
    02-09
  • Delphi编译/链接过程 delphi编程案例
    Delphi编译/链接过程 delphi编程案例
    下面展示了Delphi是怎样编译源文件,并且把它们链接起来,最终形成可执行文件。当Delphi编译项目(Project)时,将编译项目源文件、窗体单元和其他相关单元,在这个过程中将会发生好几件事情:首先,Object Pascal编译器把项目单元编译为二进制对象文件,然后
    02-09
  • Delphi CompilerVersion Constant / Compiler C
    http://delphi.wikia.com/wiki/CompilerVersion_Constant The CompilerVersion constant identifies the internal version number of the Delphi compiler.It is defined in the System unit and may be referenced either in code just as any other consta
    02-09
  • Delphi revelations #1 – kbmMW Smart client
    Delphi 启示 #1 – kbmMW Smart client on NextGen (Android) – 作用域问题以更高级的方式使用kbmMW smart client,在Android设备上,我遇到了问题。通过继承TInvokeableVariantType,kbmMW smart client可以使用Delphi支持的特殊类型的自定义Variant,从而可
    02-09
  • Delphi 调用DLL外部函数时的指针参数
    某项目需要调用设备厂家提供的DLL的函数,厂家给了一个VB的例子,有个参数是ByRef pBuffer As Single。于是在Delphi中用buffer:array of single代替:function func(buffer:array of single;count:integer):integer;far;stdcall;external 'func.dll';调用后bu
    02-09
  • 《zw版·Halcon-delphi系列原创教程》 Halcon分
    《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形为方便阅读,在不影响说明的前提下,笔者对函数进行了简化::: 用符号“**”,替换:“procedure”:: 用大写字母“X”,替换:“IHUntypedObjectX”:: 省略了字符:“const”、“OleVa
    02-09
  • 最简单的delphi启动画面(转)
    首先做一窗体,然后将BorderStyle的属性设为bsnone,放image控件,align设为alclient 然后将主程序的修改为 uses Windows, Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$ R *.res} begin Application.Initialize; Form2:=TForm2.Cre
    02-09
  • Delphi备忘三:TCollection的使用,用Stream保
     代码unit ufrmGetFunctionDefine;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,TypInfo,  Dialogs,ufrmStockBaseCalc, StdCtrls, ComCtrls,uQEFuncManager,uWnDataSet,uDataService;type  T
    02-09
  • Delphi Dcp 和BPL的解释
    dcp = delphi compiled package,是 package 编译时跟 bpl 一起产生出来的,记录着 package 中公开的 class、procedure、function、variable、const.... 等等的名称和相对位址。package英文翻译过来就是“包”。如果 某个控件包 A 引用了 控件包 B,当 控件包
    02-09
点击排行