1. 介绍
许多人认为面向对象概念和关系型数据库相互不一致,并且不能结合。事实上完全相反!经过灵活的使用,一个关系型数据库能够为面向对象(OO)模型提供一套优秀的实现。同样的模型能够用来开发编程代码和建立关系型数据库结构。
关系型数据库技术是意义深远的、强大的,但它比许多开发商使你相信的要难得多。单个表是简单易懂的、直观的,但是要彻底了解由数以百计的表组成(这是常见的)的应用是相当困难的。这正是OO模型有用之处。
OO模型使你深入地、连贯地思考问题。OO模型提供一种问题的超结构(superstructure)的思考方式,然后该方式能够用关系型数据库的更低层的组成块来实现。
本文章综合地讨论了关系型数据库技术,而不是集中于特定的产品上。我们将不讨论物理设计细节(例如存储分配和物理聚集),因为它们是依赖于产品的。
用关系型数据库实现UML模型有两个方面:映射结构(第2节)和映射功能(第3节)。第4节注解了面向对象到关系型数据库的扩展。第5节总结本文章。
2. 结构映射到表
UML对象模型在本质上只是一个扩展的实体-关系(ER)模型[ii]。用来设计数据库的ER模型的方式受到普遍接受,而我们将讲述一种近似的但更强大的方式-使用UML对象模型。OO模型的主要优势在于编程和数据库使用相同的模型工作。而且,作为考虑功能性的一种方式(第3节),我们强调OO模型的导航。这一节显示如何实现UML对象模型的主要构造。
2.1 标识(identity)
实现对象模型的第一步是处理标识。我们从定义几个术语开始。
我们推荐你在超过30个类的RDBMS应用里使用基于存在的标识。基于存在和基于值的标识都是所有RDBMS应用的可行选项。
2.2 域(属性类型)
属性类型是UML术语,对应于数据库著作里的域的术语。比起直接用数据类型,域提升到更一致的设计,并便利了应用的定位。
简单域很容易实现。你仅仅要定义相应的数据类型和大小。并且每个用了域的属性,你都必须为每个域约束加入一条SQL检查子句。简单域的一些例子是:名字(name),长字符(longString)和电话号码(phone-Number)。
一个枚举域把一个属性限制在一系列的值里。枚举域比简单域实现起来更复杂,图1显示了四个方法。
图1 枚举的实现方法。
实现方法 | 优势 | 劣势 | 建议 |
枚举字符。定义一条SQL检查约束,把该枚举限制在允许的值里。 | 简单。受控的方便搜索的词汇表。 | 大的枚举难以使用检查。约束难以编码。 | 我们正常地选择。 |
每个枚举值一个标记。为每个枚举的值定义一个布尔型属性。 | 回避命名的难处。 | 冗长 - 每个值一个属性。 | 当枚举值不是互相排斥的并且多个值可能同时地应用时使用。 |
枚举表。把枚举定义存储到一个表里。不是每个枚举一个表,也不是所有的枚举一个表。 | 高效地处理大的枚举。不用改变应用的代码就可以定义新的枚举值 | 偶尔使用时很麻烦。必须编写通用的软件来阅读枚举表和加强值。 | 适合大的枚举和没有结尾(open-ended)的枚举。 |
枚举编码。把枚举值编码作为有序的数字。 | 节省磁盘空间。有助于用多种语言处理。 | 大大地复杂化了维护和调试。 | 避免使用,除非你要用多种语言处理。 |
2.3 类
正常情况下,我们把每个类映射为一个表,每个属性映射为一个列。你可能因一个已产生的标识符(基于存在的标识符)、隐藏的关联(第2.4节)和通用鉴别器(第2.5节)需要一些另外的列。
2.4 关联
现在我们讨论关联的实现。我们已经把我们的陈述分为建议的映射(我们正常使用的映射),可选的映射(我们偶尔使用的映射)和不鼓励的映射(我们遇到的应该避免的错误)。我们所有的例子都采用基于存在的标识。
2.4.1 建议的映射
共5页: 1 [2] [3] [4] [5] 下一页 |