数据库系统概论学习2-《关系数据库与 E/R 模型》
-----------------------------一直更新学习内容------------------------------------
建立一个关系数据库需要几步?
2.关系数据库与 E/R 模型
- 外键:
不同的表中会有相同的属性。如果一个关系r1的属性中,包含了其他关系r2的主键,我们就将这个属性称为r1上的外键(foreign key)。例如选课信息表中的ID属性,是学生信息表中的主键,那么ID属性就是这个选课信息表上的外键(注意:在选课信息表中,{ID,CourseID}是主键,而{ID}不是)。
为什么我们要提出外键的概念呢?在关系r2中它是主键,我们会对它进行唯一性的检查,在关系r1中,我们并不会这么做,而从整个数据库的角度而言,它们实际上是同一个属性,这样的区别对待势必有潜在的风险。
选取主键是一项非常重要的任务,如果选取不当会对数据库造成意想不到的麻烦。以下哪些说法是正确的:
2.8 由外键引发的联想
- 参照完整性约束
在介绍外键时,我们提出了一个问题。位于不同关系中的同一个属性,可能会被给予不同的重视程度或优先级。我们在对待主键时,会考虑它是否具有排他性,是否不容易改变,而对于普通的属性我们没有,当然也没有必要有,这样的考虑。
解决这一问题的办法,就是在数据库中增加 参照完整性约束(Referential Integrity Constraint),提升我们对这个普通属性的关注度。参照完整性约束要求我们保证这个普通属性的值,如果不是一个空值,那么必须是在主键属性或候选键属性中出现过的。
例如在 Student (ID, Name, Age, Gender, YearofEnroll, Dept) 中,属性 Dept 的所有值有两种可能性,一是空值,二是 Department (Dept, Intructor, Office) 中属性 Dept 已有的值中的某一个。
除了参照完整性约束,数据库中还有实体完整性约束和用户定义完整性约束。
- 实体完整性约束
相对于参照完整性约束,实体完整性约束(Entity Integrity Constraint)容易理解得多,它是针对主键而言的。它要求,如果一个关系中的一个或多个属性是这个关系的主键,那么这个或这些属性必须可以作为区分不同元组的依据的值,且不能为空值。简而言之,就是作为主键的属性一定要有内容,因为主键是我们识别和区分元组的唯一途径,这样的要求是合理且必要的。
例如在 Student (ID, Name, Age, Gender, YearofEnroll, Dept) 中,属性 ID 不能为空值,在 Takes (ID, CourseID, Teacher, Semester, Year, Grade) 中,属性 ID 和 Course_ID 都不能为空值。
在任何关系数据库中,都要满足实体完整性约束和参照完整性约束。这被称作关系的两个不变性,是由关系系统支持的。在之后学习建立关系数据库的过程中,会涉及如何用代码来实现这两个完整性约束。
2.9 设计一个数据库之一
- 这是一个简单的回顾和总结
我们先来小小地复习一下,前面我们详细地讲解了关于实体/联系模型的内容,从什么是实体和关系,到关系的数学定义,又通过如何识别一个元组这个关乎数据库生死存亡的问题,说明了各类键和完整性约束的重要性。在讲解的过程中,我们实际上已经大体构建起了一个学生选课管理系统的框架了,下面我们把它整理一下。
- 学生选课管理系统有以下几类实体:学生,教师,课程,学院。实体有各自的属性和主键。
- 实体之间的联系有以下几种:学生、教师参与课程,教师就职于学院。实体之间的联系也有各自的属性和主键。
- 实体与实体之间的联系用关系表示,以上的内容可以表示为:
Student (ID, Name, Age, Gender, YearofEnroll, Dept)
Teacher (TeacherID, Name, Age, Gender, Major, Dept)
Course (CourseID, Name, RoomID, StartTime, Duration)
Department (Dept, Instructor, Office)
Takes (CourseID, ID, Semester, Year, Grade)
Teaches (CourseID, TeacherID, Capacity)
Works (TeacherID, Dept, YearofWorking)
请牢记这一页的内容,我们建立数据库的基础就在于此。
- 实体/联系图
我们已经通过文字的形式将学生选课管理系统的各个要素表示出来了,但是这样的方式仍然不够直观,不能清楚明了地反映实体之间的联系。这里我们就要给大家介绍另一个利器,实体/联系图(Entity/Relation Diagram),简称 E/R 图。
在 E/R 图中,我们使用不同的图形来表示实体、实体间的联系、属性等内容,通过图形间的连线确定它们的对应关系。
- 实体和属性的表示方法
我们用方角矩形表示实体,方角矩形框内是实体的名称。
用特殊的圆边矩形来表示属性,由于属性是隶属于实体或实体间的联系的,所以我们用直线将属性与其对应的内容连接起来。
在图上我们可以看到,有一个属性是加了下划线的。没错,这就是我们表示主键的方法。
2.10 E/R图初步
- 实体和属性的E/R图
2.11 设计一个数据库之二
- 别忘了还有实体之间的联系
实体及其属性我们已经会表示了,但是别忘了还有实体之间的联系。在 E/R 图中,我们用菱形来表示实体之间的关系。
很显然实体之间的关系是不能单独出现的,它的存在必然伴随着一对实体。图中为了演示方便,我们把实体的属性省略掉了。
- 实体之间的联系完整版
我们知道实体间的联系也是有它本身的属性的,它的属性同样也用特殊的圆边矩形表示。与实体属性不同的是,我们在表示关系的属性时,只写出它独有的属性,如果它的属性在与它连接的实体之中已经出现过,我们就忽略掉这个属性。因此,上图的完整形态应该是这样的:
- 实体之间联系的属性
从图中我们可以看到,Takes 中的属性 ID 和 CourseID,在学生和课程实体之中已经出现过了,所以在标明属性的时候就没有列出来。为什么我们要这样做呢?因为一般来说,实体和实体之间联系的主键是两个实体主键的并集,同时两个实体的一些非键属性也会被继承,这些属性我们已经在各自实体中明确表示出来了。所以在表示实体与实体之间联系的属性时,只列出由于联系而产生的属性,也就是它独有的属性。
2.12 教师与课程发生了什么关系?
2.13 学生上课,教授授课
2.14 设计一个数据库之三
- 实体之间联系是有对应关系的
在现实生活中,实体和实体之间的联系也是有区别的。比如对于仓库和零件来说,它们之间有存放的联系,但是一个仓库可以存放多个零件,一个零件却只能在一个仓库存放;一个学生可以选择多门课程,一门课程也可能被多个学生选择。这种数目的对应关系也是值得我们关注的。那么在我们的学生选课管理系统中,这种对应关系是什么样的呢?
2.15 “一对一”的表示方法
2.16 设计一个数据库之进阶
- 实体之间联系的细化
同样的,我们如果要求一门课必须有 2020 到 3030 人参加,学生与课程之间的多对多联系可以表示为:
其中,*∗ 表示正无穷,在上图中表示一个学生理论上来说可以选择无数门课程。如果我们限制一个学生一学期至少选择 55 门课,最多选择 2020 门课,那么连接 Course 和 Takes 的直线上应该标注 5...205...20。
还有一对多的情况与上面是类似的,我们留在练习中做好了,下面我们再介绍一个设计数据库的进阶方法。
2.16 设计一个数据库之进阶
ISA 联系
学过 C++ 的同学应该知道,C++ 里面有一项我们经常用到的神奇技能——继承。我们有一个父类名叫学生,它有学号、姓名、年龄、性别、年级等属性。它有两个子类,本科生和研究生。根据 父债子还 继承的原则,它已有的属性都会被继承,另外本科生还有其他诸如学院的属性,研究生还有研究方向、导师信息等属性等。这时候,我们就可以使用 ISA(is a)联系来表示,在 E/R 图中,是这样的:
ISA 联系用三角形表示,三角形的“尖”连接着的是父类,底部连接的是继承属性的子类。注意,ISA 联系是没有属性的,它只用来表示父类和子类的继承关系。在列举属性的时候,父类中已经出现的属性,在子类中不必重复列出,只列出子类特有的属性即可。2.17 数据库设计终极练习 Part1
2.18 做数据库也是要讲规矩的 —— 规范化
- 函数依赖
- 把函数依赖传递下去
- 1NF和2NF
- 3NF
BCNF
各类范式之间的层级关系
2.19 数据库设计终极练习-Part2
数据库系统概论学习2-《关系数据库与 E/R 模型》的更多相关文章
- 数据库系统概论学习3-SQL 语句和关系代数(一)SQL 入门
3. SQL 语句和关系代数(一)SQL 入门 3.1 数据库的编程语言 SQL 的优点 SQL 集成了数据查询(data query).数据操作(data manipulation).数据定义(da ...
- 数据库系统概论学习4-SQL 语句和关系代数(二)单表查询
4.12 字符匹配 精确查询和模糊查询 在这一节之前,我们学习的查询几乎都是精确查询,这就需要我们明确地知道某些属性的具体值.例如我们需要查询 'Wangxiaoxiao' 同学的信息,就需要在WHE ...
- 数据库系统概论(2)——Chap. 2 关系数据库基础
数据库系统概论(2)--Chap.2 关系数据库基础 一.关系数据结构及形式化定义 1.关系 关系模型的数据结构只包含单一的数据结构--关系.在关系模型中,现实世界的实体及实体间的各种联系均用单一的结 ...
- 数据库系统概论——Chap. 1 Introduction
数据库系统概论--Introduction 一.数据库的4个基本概念 数据(data):数据是数据库中存储的基本单位.我们把描述事物的符号记录称为数据.数据和关于数据的解释是不可分的,数据的含义称为数 ...
- 数据库系统概论(1)——Chap. 1 Introduction
数据库系统概论--Introduction 一.数据库的4个基本概念 数据(data):数据是数据库中存储的基本单位.我们把描述事物的符号记录称为数据.数据和关于数据的解释是不可分的,数据的含义称为数 ...
- [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型
[源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型 目录 [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型 0x00 摘要 0x01 前言 1.1 改 ...
- Paddle Graph Learning (PGL)图学习之图游走类模型[系列四]
Paddle Graph Learning (PGL)图学习之图游走类模型[系列四] 更多详情参考:Paddle Graph Learning 图学习之图游走类模型[系列四] https://aist ...
- ASP.NET MVC 5 学习教程:通过控制器访问模型的数据
原文 ASP.NET MVC 5 学习教程:通过控制器访问模型的数据 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连 ...
- StarSpace是用于高效学习实体向量的通用神经模型
StarSpace是用于高效学习实体向量的通用神经模型,用于解决各种各样的问题: 学习单词,句子或文档级嵌入. 文本分类或任何其他标签任务. 信息检索:实体/文件或对象集合的排序,例如 排名网络文件. ...
随机推荐
- Unity3D学习笔记——NGUI之UIPopupList
UIPopupList:将这个组件添加到Button上,即可构建一个下拉列表. 效果图如下: 一:使用步骤 1.首先创建一个Sprite作为button. 2.创建一个label,用于显示当前选择的选 ...
- 在DLL中动态加载其所依赖的dll
windows下LoadLibrary函数的搜索顺序是先搜索system32等系统环境变量path下注册过的路径,然后是当前路径. 这里的相对路径是指的主exe所在路径,并且相对路径在程序运行过程中可 ...
- Uva1025 A Spy in the Metro
#include <iostream> #include <cstring> #include <cstdio> using namespace std; ]; ] ...
- 守护进程监控tomcat并自己主动重新启动
昨天的tomcat问题.一天挂了3,4回,受不了了决定写个监控tomcat进程并自己主动重新启动的脚本! 在网上查资料.主要分为两类:一类是定时重新启动tomcat,这当然不是我须要的.还有一类是监控 ...
- APP https抓包
一.软件准备 charles 安卓模拟器(windows系统用逍遥模拟器,mac os 用夜神安卓模拟器) Xposed的apk安装包(安装到模拟器上),地址:http://repo.xposed.i ...
- tomcat访问日志分析
常使用web服务器的朋友大都了解,一般的web server有两部分日志: 一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 二是访问日志信息,它记录的访问的时间,IP,访问的资 ...
- 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则
原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数. ...
- 《从零开始学Swift》学习笔记(Day 21)——函数返回值
原创文章,欢迎转载.转载请注明:关东升的博客 返回值3种形式:无返回值.单一返回值和多返回值. 无返回值函数 所谓无返回结果,事实上是Void类型,即表示没有数据的类型. 无返回值函数的语法格式有如下 ...
- 《从零开始学Swift》学习笔记(Day4)——用Playground工具编写Swift
Swift 2.0学习笔记(Day4)——用Playground工具编写Swift 原创文章,欢迎转载.转载请注明:关东升的博客 用Playground编写Swift代码目的是为了学习.测试算法.验证 ...
- Online Judge(字符串-格式)
Online Judge Problem Description Ignatius is building an Online Judge, now he has worked out all the ...