1、4.1 数据库系统设计概述4.2 E/R模型4.3 UML统一建模语言4.4 对象定义语言ODL,UML (Unified Modeling Language)从面向对象软件设计的图形化标注工具发展为数据库设计描述的标注。除了多路联系外,UML提供了与E/R模型相同的能力。,1. UML类,UML中的类与E/R模型中的实体集类似。一个类框分为三部分:顶部:类名中间:属性底部:方法,2. UML类的键,指定UML中类的主键,是在每个键属性的后面加上关键字PK。,3.关联,类之间的二元联系称为关联。UML中没有多路联系,一个多路联系由多个二元联系表示。两个UML类之间的关联通过在两个类之间划一条线
2、来表示,并在线下方给出名字。关联类中连接对象的数量有一定的约束,该约束通过在连接线的末端用一个m.n标签表示,表示至少m个、至多n个对象与另外一端的对象连接。m.*表示无上限0.* 表示对象的数目没有任何约束如果在关联的末端没有任何标签,那么相当于1.1,即“有且只有一个”,例4.36,0.1,0.*,例4.37 在UML中表达引用完整性,4.自关联,一个关联的两端可以连接同一个类,这样的关联称为自关联。为了区分一个类在自关联中表现的不同角色,分别给这个关联的两端一个名字。例4.38 电影续集的关联,5. 关联类,UML中的关联类对应联系的属性,关联类放置关联的中间,拥有自己的名字,其属性是它
3、依附的关联的属性。例4.39 某个影星参演某部影片的薪水。,6. UML中的子类,子类的特点:完整对局部:每个类的对象是否是该子类的一个成员?分离对重叠:一个对象能够出现在两个子类中吗?面向对象系统中的子类是分离的,而E/R模型允许重叠子类;E/R模型和面向对象系统都允许完整的或者局部的子类。,UML的子类中只记录其父类中没有的额外的属性,且使用一个空三角箭头指向父类。子类还可以有自己的与其他类的联系。例4.40,7.聚集和组合,聚集表示类与菱形端类的多对一联系;两个类之间的一条线,末端为一个空的菱形,表示标注为0.1组合表示类与菱形端类的一对一联系;两个类之间的连线,末端为一个实心的黑色菱形
4、。例4.41,8. UML图到关系的转化,类到关系为每个类创建一个关系,关系名为类名,关系的属性为类的属性。关联到关系为每个关联创建一个名字为关联名的关系,关联的属性是两个连接类的键属性;如果有关联类附在联系上,则关系的属性中应包括关联类的属性。,该UML转化为如下的关系模式: Movies (title, year, length, genre) Stars (name, address) Studio (name, address) Stars-In (movieTitle, movieYear, starName) Owns (movieTitle, movieYear, studioN
5、ame),UML转化为如下的关系模式: Movies (title, year, length, genre) Stars (name, address) Stars-in (movieTitle, movieYear, starName, salary, residuals),从UML子类到关系,考虑子类是“分离的还是重叠的”、“是完整的还是局部的”,在E/R模式方法、面向对象方法和空值法中进行选择: 如果每一层都是分离的,用面向对象; 如果每一层既是完整又是分离的、则用面向对象只需为叶子节点构建关系; 如果层次很大并且在某些或者所有的层上是重叠的,则E/R方法是合适的。,从聚集组合到关系,
6、聚集和组合表示的是多对一的关联。不为聚集和组合构建任何关系,将菱形端类的键属性添加到非菱形端类中,在聚集(而非组合)情况下,这些属性可以为空。,转化为如下的关系模式: Studios (name, address) Movies (title, year, length, genre, studioName) MoviesExecs (cert#, name, address, networth) Presidents (cert#, studioName),UML中的支持组合,UML中的支持组合是指“弱”类(不提供键属性的类)与“支持”类之间的具有引用完整性的多对一关系;支持组合的标注:使用
7、一个带有字母“PK”的弱类框作为一个支持组合的锚,其含义是在组合另外一端的支持类的键属性是弱类键的一部分,连同弱类的任一属性被标记为“PK”。,对应的关系模式为: Studios (name, address) Crews (number, crewChief, studioName),4.1 数据库系统设计概述4.2 E/R模型4.3 UML统一建模语言4.4 对象定义语言ODL,1. ODL简介(1),一种基于文本的使用面向对象术语描述数据库结构的语言。类声明关键词class、类名、类的特性列表 class ;这里的特征可以是属性、联系或者方法。,ODL简介(2),ODL中的属性属性的声明
8、由关键字attribute、属性的类型和名字表示。可以是基本数据类型,也可以是复杂类型;例4.2,原子类型的属性例4.3,address是非原子类型的属性,ODL中的联系ODL联系的声明通过关键字relationship、类型和联系名字来声明。联系类型描述类的一个单个对象与这个联系连接;联系类型可以是另外一个类(多对一)或者一个集合类型(一对多或多对多)。一个:类/对象名 | 一组:Set relationship Studio ownedBy;例4.48,relationship Set stars; 该行对应一个联系定义,放在Movie类的声明中,表示每个Movie对象和一组Star对象连
9、接。,ODL简介(3),联系的多重性和E/R中的二元联系类似,可分为多对一、一对一和多对多;不同类型对应的两个联系声明中分别使用“Set”(多)和“类型名”(一)的不同组合;“多”可以是“零”,表示“任一个子集(包括空集)均可”例4.50,仍然针对图4-45中的两对联系:Stars和starredIn是多对多的,ownedBy和owns是多对一/一对多的。Movies中的relationship Set stars 和Star中的relationship Set starredInMovies中的relationship Studio ownedBy 和 Studio中的 relationsh
10、ip Set owns,ODL简介(4),反向联系用于表达一对联系之间的“互逆”性,注意反向是双方交互的(成对出现)。反向联系的定义: inverse 如跨类,则原类名:原联系名;例4.49,对应P111图4-45中的代码段。其中有两个反向联系对,ODL简介(5),ODL中的基本类型原子类型:整型、浮点型、字符型、字符串型、布尔型和枚举型类名:实际是一个包含类的所有属性和联系的结构用类型构建器(type constructor)将基本类型组合成结构化类型集合类型,以下均设T为任意类型,集合(set):Set,无序、元素不能重复出现包(bag):Bag,无序、元素可重复出现 1,2,1和2,1,
11、1是相同的包链表(list):List,长度可为0、有序。string即list。1,2,1和2,1,1是不同的链表,ODL简介(6),数组(array):Array,整数i表示长度Arraychar,10字典(dictionary):Dictionary,表示T,S元素对的有限集合。每对元素由一个键类型T的值和一个值域类型S的值构成,不能有T值相同的元素对,但可以是多对一以上的集合、包、链表、数组和字典统称为集合类型。结构(structure)若T1, , Tn是类型,F1, , Fn分别是其域名,则 Struct NT1 F1, , Tn Fn表示一个名为N的结构类型,包含n个域,其第i个
12、类型为Ti,域名为Fi 。,ODL简介(7),ODL数据类型的使用声明联系的类型可以是一个类,或者应用于类的集合类型构建器的单独使用;合法的声明: Movie; 一个类 Bag;一个类的集合类型注意以下几种错误的联系声明:联系类型不能含有结构类型 Struct N Movie field1, Star field2;联系类型不能含有原子类型 Set联系类型不能含有多个集合类型 Set,ODL简介(8),属性的类型先由原子类型或其他类型构造,然后可以多次使用结构体和集合类型构建器来构建;一些属性类型的例子Integer ;原子类型Struct N string field1, integer f
13、ield2;原子类型结构List;原子类型的集合类型Array;由原子类型构成的结构的集合类型,2. ODL中的子类,子类继承父类的所有属性,此外子类还可以有自己的属性将一个类C声明为另一个类D的子类,在C的声明后加上extends name of D例4.52多继承:用冒号将类别分开,3. 在ODL中声明键,ODL中的键声明声明键对于一个类来说是可选的,因为在面向对象ODL中,所有对象都有一个对象标识。也可以使用关键字key ( keys),后跟属性或属性列表来声明键;其中若某个键由多个属性构成,则加括号;例4.53单个键, class Movie (key (title, year)多个键
14、keys 键1,键2,,方法键。将方法声明为键,表示类中不同对象在该方法上的返回值不同联系键。多对一联系声明为键表示该联系中一端“可以”是多端的键。例4.54,4. 从ODL设计到关系设计(1),ODL到关系模型的转化方法类似于E/R模型,但有些不同E/R中实体集一定要有键,而ODL中键是可选项为类创建关系时,自创一个属性作为键E/R属性和关系属性都要求必须是原子类型,但ODL没有这样的限制非原子类型要按照特定的处理方式转化为原子类型如果转化后产生了不规范的关系,则要按照前面介绍过的关系模式分解的方法进行优化处理ODL允许声明方法作为设计的一部分,但是方法不能转化为关系模式,可通过建立对象关系
15、模型来解决。,4. 从ODL设计到关系设计(2),从ODL属性到关系属性满足两个假设,则直接转化类中的所有特性都是属性(不是联系或方法)属性的类型都是原子类型(不是结构或集合)可以创建一个属性来表达对象标识并且让它作为相应关系的键。例4.55, MovieExecs (cert#, name, address, networth),类中的非原子类型属性简单的结构类型为结构的每个字段定义一个关系的属性即可如果重名则重命名例4.56 Star (name, street, city),4. 从ODL设计到关系设计(3),集合类型属性的表示主流办法对于属性A的值的集合,为集合中的每个值都构造一个元组
16、,该元组中包括属性A和类中的所有其他属性的相应值例4.57 Star (name, street, address, birthdate)注意:对于属性A的值的集合,要为集合的每个取值构造一个元组。,一个问题:可能会导致不规范的关系,一般来说会违反BCNF的要求采用前面介绍的分解方法消除异常另一种方法把所有的集合类型的属性分离出来,将这些属性的值域与类的对象集合之间的关系看作是一个多对多联系,再去表示联系,4 从ODL设计到关系设计(4),其他类型构建器的表示包:增加count属性记录包中每个元组出现的次数。列表:增加position属性指示对应的地址在列表中的位置。定长数组,字典:表示成一个
17、由键域和值域组成的二元组的集合。,4. 从ODL设计到关系设计(5),ODL中联系的表示E/R模型中可为每个联系创建一个新关系,该关系联接两个相关类的键ODL中为每对联系建立一个关系例如:为联系对ownedBy和owns创建一个关系StudioOf:StudioOf (title, year, studioname)为联系对stars和starredIn创建一个关系StarsIn:StarsIn (title, year, starname),对多对一联系,将该联系与联系中“多”的那一方的类建立一个关系(即组合两个拥有共同键的关系),不会破坏BCNF条件Movies (title, year,
18、 length, genre, studioname)多对多联系不可 Movies (title, year, length, genre, studioname, starname)多对一联系不能组合“一”方,会违反BCNF条件Studio (name, address, movietitle, movieyear),4. 从ODL设计到关系设计(6),如果没有键会怎样?如果不存在可以充当键的属性(ODL中的键是可选项)创建一个新的属性-证书,用来标识对象例:假设明星名字不足以为键,则建立一个“证书号”属性作为键。 Stars (cert#, name, street, city, birthdate)则电影与明星之间的多对多联系可以表示为: StarsIn (title, year, cert#),习题P113 4.9.1、 4.9.4、 4.9.8P117 4.10.1 a) d) 4.10.3 a) b) c) e) h) i) 4.10.4,