of {$slidecount} ½ {$title} ATZJG.NET {$author}

首页






其他高级设计语言
UML(Unified Modeling Language)
ODL(Object Definition Language)


Haifeng Xu


(hfxu@yzu.edu.cn)

This slide is based on Jeffrey D. Ullman's work, which can be download from his website.

目录

面向对象的 DBMS

面向对象的 DBMS

Standards group: ODMG=Object Data Management Group.

“Operational Database Management Systems” (ODBMS)

ODL=Object Definition Language. 与 SQL 中的 CREATE TABLE 类似.

OQL=Object Query Language. 试图将 SQL 移植到 OO 框架中.

Framework - (1)

Framework - (1)

ODMG 希望 OO-DBMS 的供应商能够提供像 C++ 那样的面向对象的语言, 并具有扩展(OQL), 使得程序员可以在数据库和“宿主语言”之间进行数据的无缝传输.

Framework - (2)

Framework - (2)

ODL 是用于定义持久化(persistent)的类, 其对象永久存储在数据库中.

ODL 概述

ODL 概述

ODL(Object Definition Language, 对象定义语言)是一种基于文本的使用面向对象术语来描述数据库结构的语言.

与 UML 一样, 类是 ODL 中的核心概念. 就像 UML 类一样, ODL 中的类具有名字、属性和方法. “联系”与 UML 的“关联”类似, 但是在 ODL 中“联系”不是一个独立的概念, 而是可以作为特征的附加成员嵌入到类中.

一个类的声明包括:

ODL 中一个最简单的类声明形式如下:

class <name> {
  <list of properties>
};

这里关键字 class 后面跟着类的名字和一个花括号括起来的特征列表. 特征(properties)可以是属性(attribute)联系(relationship)方法(method).

各特征之间使用分号(semicolon)隔开.

ODL 中的属性

ODL 中的属性

最简单的特征是属性(attribute). 在 ODL 中, 属性不必为整型或字符串等简单类型. ODL 有一个类型系统, 它允许构建结构类型或集合类型.

例如,

在类声明中, 属性是由关键字 attribute、属性的类型和名字表示的.

例如, Movie 类的 ODL 声明

class Movie {
    attribute string title;
	attribute integer year;
	attribute integer length;
	attribute enum Genres {drama, comedy, sciFi, teen} genre;
};

这里最后一个属性 genre 是枚举(enum)类型 Genres, 花括号中的列表列出了此枚举类型 Genres 的取值. 枚举类型必须有一个名字.

属性和联系的声明(Attribute and Relationship Declarations)

属性和联系的声明(Attribute and Relationship Declarations)

属性(通常)是指带有某种(不涉及类的)类型的元素.

attribute <type> <name>;
relationship <type> <name>
inverse <relationship>;

联系(relationships)连接某个对象到从属于某个类的一个或多个对象.

ODL 联系是在类的声明里面通过关键字 relationship、类型和联系名字来声明.

联系类型描述了类的一个单个对象与这个联系连接. 典型地, 这个类型可以是另外一个类(如果联系是多对一的)或者一个集合类型(如果联系是一对多或者多对多).

例子 4.48

假设要给例 4.46 中的 Movie 类声明增加一个属性: 一组影星. 更明确地说, 是要求每个 Movie 对象都与一组 Star 对象(该电影的影星)连接. 表达两个类 Movie 和 Star 之间连接的最好方式是使用联系(relationship). 该联系可以在 Movie 类声明中用以下代码行实现:

relationship Set<Star> stars;
inverse <relationship>;

这样, 在每个 Movie 类的对象中, 都有一组对 Star 对象的引用. 这组引用命名为 stars.

反向联系(Inverse Relationships)

反向联系(Inverse Relationships)

假设类 C 有一个联系(relationship) R连接CD.

于是类 D 必存在到类 C 的某个联系 S.

RS 必须是真正的逆. 如果对象 d 经由联系 R 连接到对象 c, 则 c 必定经 S 连接到 d.

例子: 属性和联系

例子: 属性和联系

class Bar {
attribute string name;
attribute string addr;
relationship Set<Beer> serves inverse Beer::servedAt;
}
class Beer {
attribute string name;
attribute string manf;
relationship Set<Bar> servedAt inverse Bar::serves;
}

The type of relationship serves is a set of Beer objects.

The :: operator connects a name on the right to the context containing that name, on the left.

关系的类型

关系的类型(Types of Relationships)

关系的类型是下面几种类型之一:

  1. 一个类, 例如 Bar. 若是这样, 具有此关系的对象只能联系到一个 Bar 对象.
  2. Set<Bar>: 此对象连接到一个 Bar 对象集.
  3. Bag<Bar>, List<Bar>, Array<Bar>: 此对象连接到装有 Bar 对象的一个包(Bag), 链表(List) 或数组(array).

关系的多重性

Multiplicity of Relationships

所有 ODL 关系都是 binary 的.

多对多的关系(many-many relationship)以及其反向关系具有 Set<...> 类型.

多对一的关系(many-one relationship)对于 "one" 具有 Set<...> 类型, 而多的一方("many")只是class类型.

一对一联系在两个方向上都是 class 类型.

例子: 多重性

例子: 多重性(Multiplicity)

另一个多重性例子

另一个多重性例子

处理多路关系

处理多路关系(Coping with Multiway Relationships)

ODL 不支持 3-路或更高路的关系.

我们必须通过一个"连接"类(connecting class)模仿多路关系, 其对象代表了我们希望通过多路关系连接的一大堆对象.

连接类(Connecting Classes)

连接类(Connecting Classes)

To do ...

  1. Drinkers1(name,addr)
    • 在 4NF 中, 仅有的函数依赖是 $\text{name}\rightarrow\text{addr}$.
  2. Drinkers2(name,phones,beersLiked)
    • 这个子关系不属于 4NF. 因为有多值依赖 $\text{name}\rightarrow\rightarrow\text{phones}$$\text{name}\rightarrow\rightarrow\text{beersLiked}$ 存在. 并且没有函数依赖, 因此所有这三个属性构成了这个子关系的键.

例子: 分解子关系 Drinkers2

例子: 分解子关系 Drinkers2

刚才两个 MVD $\text{name}\rightarrow\rightarrow\text{phones}$$\text{name}\rightarrow\rightarrow\text{beersLiked}$ 告诉我们要将关系 Drinkers2 分解为:

MVD's+FD's 的原因

MVD's+FD's 的原因

问题: 对于关系 R, 给定 MVD 集合和 FD 集合. 某个 FD 或某个 MVD 是否也在 R 上成立.

解决办法: 利用图例去发现给定集合的所有推断, 去检查是否可以推断出目标依赖.

为什么我们要关注

为什么我们要关注

  1. 4NF 技术上需要一个 MVD 违例.
    • 需要从给定的 FD's 和 MVD's(它们可能自身并不违反 4NF)去推断违反 4NF 的 MVD's
  2. 当我们分解时, 我们需要将 FD's+MVD's 作投影.

例子: 追踪含有 MVD's+FD's 的图例

例子: 追踪含有 MVD's+FD's 的图例

为应用 FD, 和以前一样, 要使得符号相等.

To apply an MVD, generate one or both of the tuples we know must also be in the relation represented by the tableau.

我们将证明: 如果有多值依赖 $A\rightarrow\rightarrow BC$ 和函数依赖 $D\rightarrow C$, 则可推断出 $A\rightarrow C$.

$A\rightarrow C$ 的图例

$A\rightarrow C$ 的图例

目标是证明: $c_1=c_2$.

例子: MVD 的传递规则(Transitive Law for MVD's)

例子: MVD 的传递规则(Transitive Law for MVD's)

$A\rightarrow\rightarrow B$$B\rightarrow\rightarrow C$, 则 $A\rightarrow\rightarrow C$.

$A\rightarrow\rightarrow C$ 的图例

$A\rightarrow\rightarrow C$ 的图例

目标: 推断存在元组 $(a, b_1, c_2, d_1)$.

推断 MVD's+FD's 的规则

推断 MVD's+FD's 的规则

从一个具有两行的图例来说明.

推断: 应用函数依赖(Inference: Applying a FD)

推断: 应用函数依赖(Inference: Applying a FD)

应用函数依赖 $X\rightarrow Y$. 找出在属性集 $X$ 上一致的行, 迫使它们在属性集 $Y$ 上取值也一致.

推断: 应用多值依赖(Inference: Applying a MVD)

推断: 应用多值依赖(Inference: Applying a MVD)

应用多值依赖 $X\rightarrow\rightarrow Y$. 对于在属性集 $X$ 上取值相同的两行,

Inference: Goals

Inference: Goals

为测试 $U\rightarrow V$ 是否成立, 我们接着察看 $V$ 属性组上的两个变量是否相同.

如果我们测试的是多值依赖 $U\rightarrow\rightarrow V$, 我们察看图例中的一行是否是原来的那行, 即是通过交换属性组 $V$ 上的值得到的.

Inference: Endgame

Inference: Endgame

应用所有给定的 FD's 和 MVD's, 直到我们不再改变图例为止.

如果我们达到目的, 则依赖性被推出.

否则, 所得到的最后的图例是一个反例.

End






Thanks very much!

This slide is based on Jeffrey D. Ullman's work, which can be download from his website.