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

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

从前,在北京降生了一个漂亮的小女孩。接生的李阿姨说,她的声音这么大,好象想要全世界的人都听到。
他的父母就为她取了一个很好听的名字,叫“王菲”。于是,所有的小朋友就叫她“王菲”,“王菲”就是她童年的标识。
在她上初二的时候,认识了二班另一个叫“王菲”的同学,而且和她同一天生日。不过,同学们常常将她俩叫错,后来,就分别叫她们“大王菲”和“小王菲”。
在大王菲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函数是不一样的。
第三节面向对象的未来
迷信面向对象技术的程序员相信,世界上的一切东西都可以用类来描述,用对象来建模。诚然,自从有了面向对象的思想之后,原来复杂的数据结构、软件算法变得那么的清晰和简单。面向对象的思想改变了我们对软件的看法。就像当初结构化程序设计思想将人们的思维从错综复杂的算法中解救出来一样,面向对象的思想让我们的思维聚焦在高层次的软件体系设计方面,而不再困惑于软件基本的数据和算法方面。因为,软件基本的数据和算法都封装成为对象而已,而且现在这些对象就象建筑材料一样到处都能找到,有砖,有瓦,有钢精水泥制成的大梁……。在软件产业的飞速发展和不断缔造辉煌的今天,面向对象思想功不可莫。记得大陆开始改革开放时,第一件事就是“解放思想”。由此可见,新的思想在人类进步历程中起着重要的作用。
然而,任何一种思想都有局限性,或者需要不断的发展和完善。从客观上讲,现行的面向对象编程技术已经相当成熟,面向对象的数据库也在发展。但在实际应用开发中,总能碰到难以解决的问题,总能萌发出无法实现的伟大构想。

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

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

  1. 悟透delphi 第五章 包

    第五章包 我们在日常生活中会用到各式各样的包,钱包.公文包.背包.书包--,包里面都装有经常要用的东西.一旦你那天要出门远行,带上该带的包就可以了.不用再考虑包里面具体的东西,尽管包里有的东西用得着而 ...

  2. 悟透delphi 第二章 DELPHI与WIN32时空

    第一章  DELPHI的原子世界 第二章  DELPHI与WIN32时空 第三章  多线程 第四章  接口 第五章  包 第六章  事件与消息 第七章  组织你的模块 第八章  探索数据库 第九章  ...

  3. 网工学习 第十一章 网络管理 网络管理基础 网络管理协议五大标准 SNMP协议 RMON

    目录 第十一章 网络管理 网络管理基础 网络管理协议五大标准 SNMP协议 SNMP协议的操作 SNMPv1 SNMPv2 SNMPv3 管理数据库MIB-2 被管理 对象标识符OID RMON 第十 ...

  4. Access教程 第一章 Access数据库基础

    本章内容 ◆ 数据库基础知识及关系数据库管理系统. ◆ Access 2003 中文版介绍. 数据库技术产生于60年代末.70年代初,它的出现使计算机应用进入了一个新的时期--社会的每一个领域都与计算 ...

  5. 悟透delphi 第二章 DELPHI与WIN32时空

    我的老父亲看着地上玩玩具的小孙子,然后对我说:"这孩子和小时的你一样,喜欢把东西拆开,看过究竟才罢手".想想我小时侯,经常将玩具车.小闹钟.音乐盒,等等,拆得一塌糊涂,常常被母亲训 ...

  6. [转]李战大师-悟透delphi 第九章 多层体系结构

    大师当年未完成,占位:) 转载于:https://www.cnblogs.com/yjmyzz/archive/2009/12/15/1624725.html

  7. 悟透JavaScript(理解JS面向对象的好文章)

    引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...

  8. 悟透delphi 第十章 操作界面与操作逻辑

    本书原著李战(leadzen)大牛,由tingsking18整理,本人blog发布的版本经过战哥同意,转载请著名出处和原作者!第十章 操作界面与操作逻辑 我们在前面的曾经讨论过,用户界面与商业逻辑分离 ...

  9. 悟透delphi 第十章 操作界面与操作逻辑

    第十章操作界面与操作逻辑 我们在前面的曾经讨论过,用户界面与商业逻辑分离的好处.这样的分离可以让软件体系结构更加合理,结构易于理解,从而增强软件的灵活性和可维护性. 正如我谈到过,我们讨论的目的是为了 ...

最新文章

  1. 在visual studio 2010中调用ffmpeg
  2. 一本关于 女仆小说的构思,有能力写的看下
  3. Docker、Kubernetes、Apache Mesos 之争 | 一个与传说不同的故事
  4. 第三课--EFM32GG11系列--串口接收不定长度数据的几种方式
  5. laravel + Vue 前后端分离 之 项目配置- 生产环境部署
  6. java 画图板源代码_非常值得学习的java 绘图板源代码
  7. iOS 之 const
  8. UNIX TCP回射服务器/客户端之使用epoll模型的服务器
  9. MRTG在Windows平台的安装及使用
  10. 苏州为什么只能做二线中游?
  11. 联名款Redmi K40游戏增强版今日揭晓:神秘女主粉色头发吸睛
  12. html博客网页代码_Python自动化运维系列:Django搭建个人博客之前端篇
  13. 2023王道C语言训练营(二叉查找树-顺序查找-折半查找)
  14. 电商支付-使用Restful api接口集成Paypal支付方式(一)
  15. HTML中的window对象和document对象详解
  16. Vivado时钟之间的三种关系
  17. 性能优化之mysql优化_性能优化之MySQL优化
  18. 一个成都程序猿眼中的成都和天府软件园,先从蚂蚁金服说起…
  19. 全文检索Elasticsearch研究
  20. Linux 30岁啦,这些历史你知道多少呢?

热门文章

  1. php excel导入数据库显示乱码,php修改excel表格数据库数据格式-使用phpexcel导入excel表格数据到MYSQL,乱码怎么解决...
  2. linux 索引,Linux学习笔记-索引类命令
  3. 我的成长笔记20210330(测试空闲期)
  4. python实践项目(九)
  5. matlab consumption,Lesage matlab 空间
  6. mysql复购率_MYSQL系列(5) 电商常用指标查询
  7. android 使用shell模拟触屏_Appium常用操作之「微信滑屏、触屏操作」
  8. lesson6 复数及复指数
  9. 利用D3D抓取GPU数据
  10. Java判定1到4可以组成多少个互不相同且无重复的三位数