面向对象的关系数据库设计

面向对象方法中的数据库设计 最近收到不少网友关于在面向对象的分析设计中如何进行数据库设计的疑问。在大象-thinking in uml一书里,我详细讲述了面向对象从需求到设计的整个过程,但确实对数据库设计着墨甚少。因此写这篇文章对这个问题详细说明,在第二版里应当也会加上这一部分。 先贴出一位网友的疑问以及我的回复,作为这篇文章的引子:网友fdshxp问道:在软件开发时要进行数据库设计,现在通常的做 阅读详情
面向对象的关系数据库设计

一、概念的区分  有些人把面向对象的数据库设计(即数据库模式)思想与面向对象数据库管理系统(OODBMS) 理论混为一谈。其实前者是数据库用户定义数据库模式的思路,后者是数据库管理程序的思路。用户使用面向对象方法学可以定义任何一种DBMS数据库,即网络型、层次型、关系型、面向对象型均可,甚至文件系统设计也照样可以遵循面向对象的思路。  面向对象的思路或称规范可以用于系统分析、系统设计、程序设计,也可以用于数据结构设计、数据库设计。OOSE自上至下、自始至终地贯彻面向对象思路,是一个一气呵成的统一体。面向对象的数据库设计只是 OOSE 的一个环节。

二、数据库设计的重要性  一般数据库设计方法有两种,即属性主导型和实体主导型。属性主导型从归纳数据库应用的属性出发,在归并属性集合(实体)时维持属性间的函数依赖关系。实体主导型则先从寻找对数据库应用有意义的实体入手,然后通过定义属性来定义实体。一般现实世界的实体数在属性数 1/10 以下时,宜使用实体主导型设计方法。面向对象的数据库设计是从对象模型出发的,属于实体主导型设计。  一般数据库应用系统都遵循以下相关开发步骤:

  1设计应用系统结构;  2 选择便于将应用程序与 DBMS 结合的DBMS体系结构,如RDBMS;  3 根据应用程序使用的环境平台,选择适宜的DBMS(如Oracle)和开发工具(如PB);  4 设计数据库,编写定义数据库模式的SQL程序;  5 编写确保数据正确录入数据库的用户接口应用程序;  6 录入数据库数据;7 运行各种与数据库相关的应用程序,以确认和修正数据库的内容。

  对以上各步骤,有几点需要说明:  (1) 这不是瀑布模型,每一步都可以有反馈。以上各步不仅有反馈、有反复,还有并行处理。比如一些库表在数据录入时,另一些库表设计还在修改。这与我们的递增式开发方法有关,也与面向对象的特征有关。   (2) 上述顺序不是绝对的,大多数场合是从第三步开始的。  (3) 对大多数数据库应用系统来说,上述各步中最重要、最困难的不是应用系统设计而是数据库设计。

三、DBMS的支持和数据库设计  很多数据库应用系统开发者不重视数据库设计的原因是:他们太迷信DBMS,认为购入一个功能强大的 DBMS后数据库设计就不困难、不重要了。一些国内外的数据库教材常常是在为DBMS的开发厂商做宣传,而很少站在数据库用户角度,从数据库应用系统出发介绍数据库设计方法。结果往往使读者搞不清书中介绍的是数据库管理程序的设计思想,还是应用这种 DBMS 进行数据库设计的思想。  其实,DBMS只是给用户为已采用的数据库提供一个舞台,而是否使用这个舞台上的道具以及唱什么戏,则完全取决于用户的戏剧脚本和导演(开发者)的安排。例如,公路局系统所使用的数据库管理系统,是以二维表为基本管理单元、支持所有关系代数操作、支持实体完整性与实体间参照完整性的全关系型 RDBMS,而我们要在这个舞台上利用上述"道具"设计一个面向对象的关系数据库。

四、应用对象模型与RDBMS模型的映射  数据库设计(模式)是否支持应用系统的对象模型,这是判断是否是面向对象数据库系统的基本出发点。由于应用系统设计在前,数据库设计随后,所以应用系统对象模型向数据库模式的映射是面向对象数据库设计的关键。

1. 3层数据库模式面向对象模型的扩展  一般数据库设计多参照ANSL/SPARC关于数据库模式的3层标准结构提案。最接近物理数据库的内部模式由 DBMS 提供的SQL来描述。概念模式可以由若干个内部模式聚集而成,它是由数据库用户规范的一些表的集合。一般的概念模式是数据库物理模式作用域的边界,它能实现数据库的物理意义、特定DBMS 的特殊操作对外部应用程序的信息隐蔽。外部模式是从特定用户应用角度看待的数据库模式,从不同的应用出发对同一概念模式可以给出多种不同的外部模式。当外部应用系统以对象模型进行抽象时,从各个应用出发抽象出的对象模型可以映射到外部模型上,对此我们不妨称之为外部对象模型。但是,外部模型只是概念模型的子集,所以面向对象的数据库设计核心在于系统对象模型(不妨称之为概念对象模型) 向数据库概念模型的映射 。

2. 对象模型向数据库表的映射规则  由于 RDBMS 是以二维表为基本管理单元的,所以对象模型最终是由二维表及表间关系来描述的。换言之,对象模型向数据库概念模型的映射就是向数据库表的变换过程。有关的变换规则简单归纳如下:  (1) 一个对象类可以映射为一个以上的库表,当类间有一对多的关系时,一个表也可以对应多个类。  (2) 关系(一对一、一对多、多对多以及三项关系)的映射可能有多种情况,但一般映射为一个表,也可以在对象类表间定义相应的外键。对于条件关系的映射,一个表至少应有3个属性。  (3) 单一继承的泛化关系可以对超类、子类分别映射表,也可以不定义父类表而让子类表拥有父类属性;反之,也可以不定义子类表而让父类表拥有全部子类属性。  (4) 对多重继承的超类和子类分别映射表,对多次多重继承的泛化关系也映射一个表。  (5) 对映射后的库表进行冗余控制调整,使其达到合理的关系范式。

3. 数据库模式要面向应用系统  我们选择面向对象的系统设计也好,面向对象的数据库设计也好,根本目的是服务于应用系统的需要。

五、面向对象关系数据库设计效果  从某种意义上讲,是数据库设计的面向对象特征最终奠定了整个系统的面向对象性,才使面向对象方法在程序开发阶段全面开花。其效果归纳如下:

1. 数据库结构清晰,便于实现 OOP  由于实现了应用模块对象对数据库对象的完全映射,数据库逻辑模型可以自然且直接地模拟现实世界的实体关系。用户所处的当前物理世界、系统开发者所抽象的系统外部功能,与支持系统功能的内部数据库 (数据结构)一一对应,所以用户、开发者和数据库维护人员可以用一致的语言进行沟通。特别是对多数不了解业务的程序开发人员来说,这种将应用对象与相应的数据对象封装在对象统一体中的设计方法,大大减轻了程序实现的难度,使他们只要知道加工的数据及所需的操作即可,而且应用程序大多雷同,可以多处继承由设计人员抽象出来的、预先开发好的各种物理级超类。

2. 数据库对象具有独立性,便于维护  除了数据库表对象与应用模块对象一一对应外,在逻辑对象模型中我们没有设计多重继承的泛化关系,所以这样得到的数据库结构基本上是由父表类和子表类构成的树型层次结构,表类间很少有继承以外的复杂关系,是一个符合局部化原则的结构,从而使数据库表数据破坏的影响控制在局部范围且便于修复,给系统开通后的数据库日常维护工作带来便利。

3. 需求变更时程序与数据库重用率高,修改少  在映射应用对象时,除关系映射规范化后可能出现一对多的表映射外,大多数应用对象与表对象是一一对应的。我们可以把规范化处理后的、由一个应用对象映射出来的多个表看成一个数据库对象。因此当部分应用需求变更时,首先,系统修改可以不涉及需求不变更的部分。其次,变更部分的修改可以基本上只限于追加或删除程序模块或追加新库表,而基本上不必修改原有程序代码或原有库表定义,从而大大减少了工作量,降低了工作难度。

六、最简单的就是最好的  客观世界是错综复杂的,计算机科学理论的发展也越来越高深、复杂。然而,人类探索理论和技术的最终目的是:让客观世界的复杂变简单,最简单的就是最好的。为此给出以下几点忠告:

1. 慎用外键  RDBMS 支持复杂关系的能力很强,无论用户怎么在逻辑上设定外键,它基本上都能从物理上帮用户实现。但是外键把许多独立的实体牵连在一起,不仅使 RDBMS 维持数据一致性负担沉重,也使数据库应用复杂化,加重了程序开发负担。这样的数据库很难理解,很难实现信息隐蔽性设计,往往把简单问题复杂化。

2. 适当冗余  减少数据库冗余的设计思路产生于70年代,它是促使 DBMS 进步的重要动力之一。然而,犹如为了节省2个字节的存储空间而酿成了如今全球为之头痛的2000年问题一样,它是计算机硬件主导时代的产物。以今天国内计算机市场价格为例,6G服务器硬盘的价格不过2000元,而上海物价局 1996 年颁发的一个人月软件开发的指导价约8000元,即一个人月的软件价格就可以购买20G左右的硬盘。即使有5万行数据的库表,每个记录压缩40字符的冗余,单纯计算合计也不足2M,即节省0.6元钱的磁盘空间。  今天的世界已进入软件主导的计算机时代。因此,最容易理解、应用开发工作量最少、维护最简单的数据库结构才是最好的。只要数据完整性、一致性不受威胁,有些冗余,不足为虑。换言之,最节省软件成本 (而不是硬件成本) 的是最好的。

3. 信息隐蔽  这是软件工程最重要的基本原则之一。简言之即信息的作用域越小越好,数据库的透明度越大越好,因为应用程序需要知道得越多就越复杂。使数据库黑盒化 (透明度高) 的方法很多,除了设计上的局部化处理外,还可以利用 DBMS 的触发器、存储过程、函数等,把数据库中无法简化的复杂表关系封装到黑盒子里,隐藏起来,特别是放到服务器端,其优越性更是多方面的。
基于面向对象(OO)的数据库设计模式探讨(2) 基于面向对象(OO)的数据库设计模式探讨(2)  一种基于指标矩阵的数据建模的方法   摘要 现在大型的管理系统有几千甚至上万张表,但几乎没有谁能搞清楚所有的数据结构,如何建立清晰明了的数据结构?如何让其他人对数据结构更加容易理解,本文以《基于面向对象(OO)的数据库设计模式探讨》为基础进一步对汇总表进行分析,通过建立指标矩阵模型,“模式”化数据库建模,建立清晰可读的汇总数据模型。 阅读详情

相关推荐

面向对象设计 5 大常见误区解析:从关系数据库映射到类图继承的实战避坑

本文深入解析面向对象设计中的5大常见误区,包括关系数据库与类图的强行映射、过度继承、贫血模型、设计模式的形式化套用以及UML图的理想化建模。通过实战案例和对比分析,帮助开发者避免这些陷阱,提升软件工程实践能力。特别针对ORM框架使用中的性能问题提供了领域驱动设计的解决方案。

weixin_33966095的博客 489

Entity Framework技术系列之3:对象-关系映射

前言 Entity Framework技术是通过SSDL(Storage Schema Definition Language)、CSDL(Conceptual Schema Definition Language)和MSL(Mapping Concept and Storage Schema Language)三层映射语言来实现对象-关系映射的。下图展示了Entity Framework对象-...

weixin_33912246的博客 170

面向对象的数据库设计方法.pdf

面向对象的数据库设计方法.pdf 面向对象的数据库设计方法.pdf

javaEE 用户、部门、角色、权限实体的关系设计与hibernate映射配置文件关系总结

文章中的项目文件已经放到Github上,欢迎大家Follow,star, 地址:https://github.com/lawlite19/SmartEducation 一:设计实体,我这里通过uml设计,然后直接可以生成java实体类(方便查看各个类的关系) (1)用户登录类User与用户详细信息类UserDetails为一对一关系; (2)用户详细信息类UserDetails与部

莫失莫忘的博客 1万+

基于面向对象(OO)的数据库设计模式探讨

内容面向对象的数据库设计对象关系模型实体对象关系模型应用总结下载参考资料简介: 面向对象(OO)和三范式(3NF)都是成熟的设计方法,本文基于面向对象设计思想和三范式数据库设计方法,提出一种实体对象分层建模的思路,其目的是设计简单明了、标准化的数据库结构,同时能够更好的支持模型驱动模型(MDA)的代码自动生成和代码复用,减少代码编写工作量。面向对象的数据库设计本模型探讨的一个数据库建模的方法,其意义主要是为《面向服务体系架构(SOA)和数据仓库(DW)的思考》(以下简称《SOA和DW》)所述的共享库提供方法论支持,建立一个简单明了、易于理解的标准化的数据结构,共享库的主要目的是为了共享数据,需

STM32 FATFS文件系统按行读取SD卡数据

STM32 SD数据实现按行读取

qq_32216815的博客 7828

面向对象的关系数据库设计(转)

面向对象的关系数据库设计(转)[@more@]  北京市公路局系统使用的是Oracle 7.3关系数据库,即RDBMS。由于我们对整个工程用了面向对象的软件工程(OOSE)开发方法学,所以数据库设计也是面向对象的。  一、概念的...

congjukun0600的博客 374

Ubuntu双系统引导修复实战:boot-repair工具详解

本文详细介绍了使用boot-repair工具修复Ubuntu双系统引导丢失问题的实战方法。当GRUB引导菜单因安装新系统或更新而损坏时,通过制作Ubuntu启动盘进入Live环境,安装并运行boot-repair,可一键完成系统修复引导,自动化执行GRUB重装与配置,解决无法进入Windows或Ubuntu的常见故障。

weixin_29224589的博客 359

关系数据库与面向对象设计映射的一些想法

一、引述 在数据表设计过程中一个表的表单字段项的常用设计为:主键+属性信息(若干)+外键。 关于主键和外键的关系可以做这样的联想:主键作为实现子对象(记录)的标识 ID,而外键作为作为父对象(记录)的标识ID. 这样外键代表的记录对象可主键标识的记录对象和可以看作对象实例层面的父子继承关系,两个表单作为更高抽象一层类层面的继承关系。 于是我们可以用面向对象的类设计思想来结构化数据关系, ...

weixin_30631587的博客 397

不只是驱动:拆解AIC8800 WiFi模组在RK Android系统的完整启动链(从DTS到HAL)

本文深入解析了AIC8800 WiFi模组在RK Android系统中的完整启动链,从设备树(DTS)配置到HAL层适配,涵盖驱动移植、固件加载及用户空间服务协同等关键环节。通过详细的技术分析和调试技巧,帮助开发者解决RK平台与AIC8800模组的兼容性问题,优化WiFi子系统性能。

weixin_30439067的博客 492

Acer宏碁暗影骑士擎AN515-58原厂系统恢复指南:从ISO镜像到完整出厂设置

本文详细介绍了为Acer宏碁暗影骑士擎AN515-58游戏本恢复原厂系统的完整指南。从准备工作、数据备份到下载官方镜像、制作恢复U盘,再到BIOS设置与恢复流程,一步步教你如何将系统完整还原至出厂状态,确保所有硬件驱动、NITROSENSE控制中心等专属优化功能恢复正常,解决系统卡顿、功能异常等问题。

weixin_29271263的博客 1099

数据库面向对象设计

面向对象的关系数据库设计  一、 概念的区分  有些人把面向对象的数据库设计(即数据库模式)思想与面向对象数据库管理系统(OODBMS) 理论混为一谈。其实前者是数据库用户定义数据库模式的思路,后者是数据库管理程序的思路。用户使用面向对象方法学可以定义任何一种DBMS数据库,即网络型、层次型、关系型、面向对象型均可,甚至文件系统设计也照样可以遵循面向对象的思路。       面向对象的思路或

把握自己。 2649

公交车调度排班优化算法研究与实现

本文提出的公交车调度排班优化算法基于遗传算法,能够较好地处理公交车调度排班问题,使得车辆数量和运营时间得到平衡,公交车的使用效率得到了优化。在模拟的公交车路线中,使用本文所提出的算法,得到了一组较优的公交车调度排班方案。其中,车辆数量的多少会影响到公交车的行驶速度和等候时间,而运营时间的长短则会直接影响到公交车的使用效率和成本。本文基于遗传算法,通过随机生成种群、选择、交叉、变异等操作,逐步优化种群中个体的适应度,最终得到较优的公交车调度排班方案。以下是本文中所使用的Matlab代码实现,供参考。

PixelLoom的博客 872
上一篇: 线程的创建方法
下一篇: 简析Visual C++中的活动数据对象
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值