热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库设计:从ER模型和UML模型到关系模型的转换及相关公式解析

本文根据b站鲁老师的教学视频整理而来,可能会偏理论化,有点枯燥,但是如果认真看完,还是会有所收获哒。从本文可以学习到

本文根据b站鲁老师的教学视频整理而来,可能会偏理论化,有点枯燥,但是如果认真看完,还是会有所收获哒。
从本文可以学习到:
对于一个即将展开的项目,我们应该怎么设计及实现数据库。
掌握概念模型(ER模型和UML模型)到关系模型的转化。

对于ER模型和UML模型不是很熟悉的小伙伴和烦恼于如何设计项目的数据库的小伙伴可以看看本文。

想画出ER模型和UML模型的朋友们可以看看这篇博客(PowerDesigner(CDM)画ER图并导出且在DBMS中运行),里面用到的PowerDesigner还可以直接帮你实现概念模型(ER图)到关系模型(代码)的转化十分方便。两篇博客结合起来,相信你能对数据库的模型设计更加得心应手。

数据库设计(DBD):构造最优的数据模型,建立数据库及其应用系统的过程。


一、数据库设计步骤

1.数据分析
2.数据建模
3.关系数据库模型
4.关系数据库管理
在这里插入图片描述
注释:概念模型(ER Model/UML Model)
上面这个图是我们设计数据库及实现的流程图,大家最好熟悉一下。

下面这个7个步骤了解就好,编写项目的小伙伴可以试着遵循下面步骤来完成项目的有关数据库设计。


1.1 规划阶段

(1)系统调查
(2)可行性分析
(3)确定数据库系统的总目标


1.2 需求分析阶段

(1)分析用户活动,产生业务流程图
(2)确定系统范围,产生系统关联图
(3)分析用户活动范围涉及的数据,产生数据流图
(4)分析系统数据,参数数据字典


1.3 概念设计阶段

目标:产生反映用户需求的数据库概念结构,即概念模型
(1)进行数据抽象,设计局部概念模型
(2)将局部概念模型综合成全局概念模型(消除冲突)
(3)评审(用户评审and 应用开发人员评审)
方法:实体联系法(ER模型)(与DBMS无关的概念模型)


1.4 逻辑设计阶段

目的:将设计好的概念模型转换成与DBMS所支持的数据模型相符合的逻辑结构(包括数据库逻辑模型和外模型)
步骤:
(1)把概念模型转化为逻辑模型
(2)设计外模型
(3)设计应用程序与数据库的接口
(4)评价模型
(5)修正模型


1.5 物理设计阶段

物理设计:对于给定的基本数据模型选取一个最合适应用环境的物理结构的过程。
步骤:
(1)存储记录结构设计
(2)确定数据存放的位置
(3)存取方法的设计
(以上三个为物理结构设计)
(4)完整性和安全性考虑
(5)程序设计


1.6 数据库的实现

(1)用DDL定义数据库结构
(2)组织数据入库
(3)编制与调试应用程序
(4)数据库试运行


1.7 数据库的运行与维护

由DBA完成
数据库的转储和恢复
数据库的安全性、完整性控制
数据库性能的监督、分析和改进
数据库的重组织和重构造


二、ER模型


2.1 re图的基本元素(略)(这个大家从课本或者很多博客都可以迅速掌握,这里就不在多说明。)

2.2 联系的设计

一个联系涉及到的实体集个体,称为该联系的元数度数
一元联系(递归联系),二元联系,三元联系。
联系类型:限制参与联系的实体的数目(如二元联系的一对多,一对一等)
例:
一元联系的1对1:运动员的顺序联系(每个运动员都有1对1的顺序)
一元联系的1对n:职工的领导联系(每个领导都有1对n的职工)
一元联系的m对n:零件的组成联系(多个零件可以组合)


2.3 采用ER模型的概念设计

(1)首先设计局部ER模型
(2)然后把各局部ER模型综合成一个全局ER模型
(3)最后对全局ER模型进行优化,得到最终的ER模型,即概念模型
两个准则:
属性不能再具有需要描述的性质
属性不能与其他实体具有联系
主体都要有一个标识符。(独特的)

设计全局ER模型
优化原则:
(1)合并实体类型
(2)消除冗余属性
(3)消除冗余联系


三、ER模型向关系模型的转化


3.1 ER图转化为关系模式集的算法

(1)实体类型的转换:将每个实体类型转换成一个关系模式,实体的属性即为关系模式的属性,实体标识符即为关系模式的键。
(2)转换联系
不同的情况做不同的处理


3.2.二元的转换关系:重重点

(1)若实体间的联系是1:1,可以再两个实体类型转换成的两个关系模式中任意的一个关系模式的属性加入另一个关系模式的键和联系类型的属性。
(2)若实体间的联系是1:n,则在n端的实体类型转换成的关系模式中加入1端实体类型的键和联系类型的属性。
(3)若实体间的联系是m:n,则将联系类型也转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。


实例:(例子更好的加快我们了解概念模型向关系模型转换的公式)

如三个关系模式
系(系编号,系名,电话)
教师(教工号,姓名,性别,学分)
课程(课程号,课程名,学分)

联系1: 教师(主管)系(1:1)
这时候联系转换可以把任意一个的主键作为其中一个的外键,加入关系模式中。
但是这里我们,系是比教师少的,所以如果我们在教工号里加入一个‘系主任教工号’的话,不是每一个教师都是系主任,所以这里我们要加在系里,因为每一个系都有一个系主任。
(下面所有的关系模式中,加深代表主键,变红代表外键,加深且变红代表既是主键又是外键。)
系(系编号,系名,电话,系主任教工号)
教师(教工号,姓名,性别,学分)
课程(课程号,课程名,学分)

联系2: 系(聘用 属性:聘期)教师(1:n)
1对多关系,所以把一方的主键加到多方去
系(系编号,系名,电话,系主任教工号)
教师(教工号,姓名,性别,学分,所在系编号,聘期)
课程(课程号,课程名,学分)

联系3: 系(开设)课程(1:n)
系(系编号,系名,电话,系主任教工号)
教师(教工号,姓名,性别,学分,所在系编号,聘期)
课程(课程号,课程名,学分,所在系编号

联系4: 教师(任教 属性:教材)课程(m:n)
多对多就要将这个联系自己转化为一个新的关系模式。联系的名字就是关系模式的名字。属性是:联系双方的主键以及本身的属性。且联系双方的主键作为一个联合主键。同时这两个联合主键又是外键。通过教工号,建立起和教工之间的联系,通过课程号,建立起和课程之间的联系。
系(系编号,系名,电话,系主任教工号)
教师(教工号,姓名,性别,学分,所在系编号,聘期)
课程(课程号,课程名,学分,所在系编号
任教(教工号,课程号,教材)

二元关系的转换大家一定要掌握!!!


3.3.三元的转换关系:

(1)若实体间联系是1:1:11:1:11:1:1,可以在转换成的三个关系模式中任意一个关系模式的属性中加入另外两个关系模式的键(作为外键)和联系类型的属性。
(2)若实体间联系是1:1:n1:1:n1:1:n,则在n端实体类型转换成的关系模式中加入两个1端实体类型的键(作为外键)和联系类型的属性。
(3)若实体间联系是1:m:n1:m:n1:m:n,则将联系关系也转化成关系模式,其属性为三端实体类型的键加上联系类型的属性,而键位m端和n端实体键的组合。
(4)若实体间联系是m:n:pm:n:pm:n:p,则将联系类型也转化为关系模式,其属性为三端实体类型的键加上联系类型的属性。而键位三端实体键的组合。


总结:(这是我总结出的公式)

1.如果没有n的情况,就在所有的1中挑选一个最合理的关系模式中加入其他的主键作为外键,同时加入联系类型的属性。
2.如果有n没m的情况,就在n的关系模式中加入所有1的主键作为外键,同时加上联系类型的属性。
3.如果有m的情况,就生成一个新的关系模式,模式名为联系名,主键为m和n的主键的联合主键,同时若有1则1的主键作为外键,同时加上联系类型的属性。同时主键作为外键。

其实看完上面的规则,大家就可以总结出各种各样形式的联系转换了。


3.4.一元联系转换为关系模式


运动员(编号,姓名,性别,名次)
联系:运动员(顺序)运动员(1:1)
运动员(编号,姓名,性别,名次,上一名次编号)

职工(工号,姓名,年龄,性别)
联系:职工(领导)职工(1:n)
职工(工号,姓名,年龄,性别,经理工号)

零件(零件号,零件名,规格)
联系:零件(组成 属性:数量)零件(n:m)
零件(零件号,零件名,规格)
组成(零件号,子零件号,数量)


3.5 采用ER模型的逻辑设计的步骤

(1)导出初始关系模式集
(2)规范化处理
逐一考察关系模式
判断他们是否满足规范要求
(3)模式评价
(4)模式修正
(5)设计子模式


四、UML模型(面向对象)

数据建模:对于一个特定的应用程序,如何在数据库中表示数据


4.1 设计关系模型方法:

(1)关系模型设计理论
(2)概念设计模型
E/R–传统的
UML子集–目前常用的


4.2 UML(Unified Modeling Language)统一建模语言

UML用于面向对象建模,但现在也用于数据库建模
UML与ER模型类似,但是不提供多元的联系。


UMLE/R
Class(类)Entity(实体集)
Association(关联)Binary relationship(二元联系)
Association Class(关联类)Attributes on a relationship(联系的属性)
Subclass(子类)Isa hierarchy(Isa层次关系)
Aggregation(聚集)Many-one relationship(多对一联系)
Composition(组成)Many-one relationship with referential integrity(带参照完整性的多对一联系)

4.3 UML类

Class Name类名、Attributes属性、Methods方法(封装)


Movies
titile:string PK
year: int PK
length:int
genre:string

类是具有相同属性和方法的对象的集合
属性是静态的,是状态,具有数据类型
PK表示主键
方法是动态的,是行为,包括参数的声明和返回值的声明

当UML用于数据建模时,删除方法,增加主键,属性类型可选。


4.4 UML关联

关联:两个类间对象的联系
表示方法
两个类间用直线(箭头可选)连接
连接名字通常写在直线下方
在这里插入图片描述

m…n 表示与C2类中一个对象有关的C1类对象的个数最少为m,最多为n
*表示无上限
在这里插入图片描述
每个学生最多能在5个校园申请课程
每个校园容纳学生数为10000到20000之间

关联类型的简写和默认值:
* 是 0…* 的简写
1 是 1…1 的简写
默认值为 1…1

关联也可以有属性称为关联类
与E/R图中联系的属性类似
在这里插入图片描述
也可以有自身关联。


4.5 子类(Subclasses):

在这里插入图片描述

(1)UML类都可以包含下级子类
(2)子类用连线连接父类,与父类连接除空心三角指向父类
(3)主键来自父类
(4)子类继承父类的属性(包括attributes and associations)
(5)子类可以有子类自己的属性以及与其他类的关联

UML 允许4种类型的子类
(1)Complete(完全)(父类中的每个对象都是某个子类的成员)或者partial(部分)
(2)Disjoint(分散)(一个对象不能包含在两个子类中)或overlapping(重叠)。

在Object-Oriented系统中,子类dijoint-即两个子类中不存在同一对象
E/R模型自动允许overlapping子类
E/R模型和00系统都运行complete或partial子类


4.6 聚集(Aggregations)组成(Compositions)

有两种类型的多对一(n:1)关联(many-one associations)
(1)聚集(Aggregations)
聚集用连线连接两个类,一方以空心菱形箭头结束
空心菱形箭头指向一方参与对象的个数必须为0…1,不需要另外标注
在这里插入图片描述
一个电影公司可以生产很多电影。(0…*)
但是一个电影不一定是电影公司生产。(0…1)

(2)组成(Compositions)
菱形箭头一方参与对象必须为1…1
菱形箭头相反一方类的每个对象必须与菱形箭头方的一个对象关联
组成以实心菱形表示
在这里插入图片描述


4.7 UML 转化为关系

1.类的转换
2.关联的转换

E/R风格:每个子类关系只存储其自身属性和码
OO风格(面向对象):子类关系存储其自身和其父类的所有属性
基本规则ER模型一样,这里就不再重复了。

希望这篇博客能让大家更加了解数据库在整个项目的位置和提高数据库建模的能力。


推荐阅读
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • 解题心得:UVA1339(逻辑分析与字符串处理+排序算法)
    解题心得:UVA1339(逻辑分析与字符串处理+排序算法) ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 数据库多表联合查询:内连接与外连接详解
    在数据库的多表查询中,内连接和外连接是两种常用的技术手段。内连接用于检索多个表中相互匹配的记录,即只有当两个表中的记录满足特定的连接条件时,这些记录才会被包含在查询结果中。相比之下,外连接则不仅返回匹配的记录,还可以选择性地返回不匹配的记录,具体取决于左外连接、右外连接或全外连接的选择。本文将详细解析这两种连接方式的使用场景及其语法结构,帮助读者更好地理解和应用多表查询技术。 ... [详细]
  • 本文详细介绍了 Python 中字符串处理的各种技巧,包括查找、复制、替换、删除、截取、连接、比较、包含检测及大小写转换等操作。特别强调了如何使用 `strip()`、`lstrip()` 和 `rstrip()` 方法去除字符串中的空格和特殊符号,以及如何通过简单的赋值语句实现字符串的复制。此外,还提供了丰富的示例代码,帮助读者更好地理解和应用这些技巧。 ... [详细]
  • 在处理大数相加的问题时,有许多方法可以借鉴。本文介绍了两种不同的函数式编程方法:一种是从网络上找到的经典实现,另一种是作者自行设计的创新方案。通过函数式编程的方式重新实现了这两种方法,其中经典实现简洁明了,而创新方案则在性能和可读性方面有所提升。这些方法不仅适用于大数相加,还可以扩展应用于其他数值计算场景。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
author-avatar
dushearer304
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有