【数据库】数据库入门(二): 关系型数据库
定义
- 属性(Attribute): 表的每一列具有固定的属性类别。
- 如姓名(Name)、年龄(Age)、地址(Address)、电话号码(PhoneNumber)等。
- 域(Domain): 每个属性所限定的数据类型及其取值范围。
- 常用的域有字符串(STRING)、日期(DATE)、整型数(INT)等。
- 元组(Tuple): 表的每一行称为一个元组,用来标识一个实体,表中不能出现相同的两个元组。
- 单个元组的取值必然是所有域的笛卡尔积(Cartesian Product)的一个元素。
- 如 {'Sunday', ‘2019-08-02‘, 100} 是 {STRING, DATE, INT} 的一个元素。
- 关系(Relation): 由行和列交错形成的二维表(Table),它表示一类数据关系。
- 单个二维表的取值必然是所有域的笛卡尔积(Cartesian Product)的一个子集。
- 关系模式(Relation Schema): 定义的多个二维表及其包含的所有属性。
- 它包括表名和一系列的属性
- 每个属性都跟域相关联
- 关系数据库模式(Relational Database Schema):
- 它是多个关系模式的集合(包括表名和所有属性);
- 它是一个关于完整性约束(Integrity Constraints,IC)的集合。
- 关系数据库状态(Relational Database State):
- 它是多个关系 / 表的集合;
- 在某一个具体时刻,一种关系数据库模式只存在一种关系;
- 所有的关系 / 表都满足完整性约束 (IC)。
关系型数据库的完整性约束
1、域约束(Domain Constraints)
元组中的每一个值必须是在其属性的取值范围之中,即既要符合定义的数据类型,又要在取值范围之中。
2、关键字约束(Key Constraints)
超键(SuperKey):在一个关系 / 表中,不存在两个独立元组的超键有相同的取值,即每一个独立元组超键的取值必不相同。
候选键(Candidate Key):当一个超键不存在它的子集仍然为超键时,这个超键被称为最小超键(minimal),也称候选键。
主键(Primary Key):取候选键集合中的其中一个,可作为当前关系 / 表的主键(主键是惟一的)。
举几个例子说明一下
- {DoB} 是关系 STUDENT 的一个超键吗?
- 不是,因为不同的元组可能在 DoB 这个属性上取相同的值,即可能存在出生日期相同的两个学生。
- {StudentID, DoB} 是关系 STUDENT 的一个超键吗?
- 是的,因为通过这一组属性,能唯一区分出一个独立的元组。
- {StudentID, DoB} 是关系 STUDENT 的一个候选键吗?
- 不是,因为存在它的子集 {StudentID} 也同样是一个超键,同时这还是一个最小的超键,因此是一个候选键。
- {StudentID} 是关系 STUDENT 的一个候选键吗?
- 是的,理由如上。
- {DoB} 是可以选为关系 STUDENT 的主键吗?
- 不是,DoB本身不是一个超键,更不会是一个候选键,所以不能作为主键。
3、实体完整性约束(Entity Integrity Constraints)
实体完整性约束主要是对主键取值的约束。由于主键是用于独立区别同一个关系中的不同元组,因此每一个元组的主键取值不能为 NULL,即不能为空。通常在定义关系或者定义属性的时候,使用 NOT NULL 关键字对主键进行修饰。
注意:关系表 R 中的其他属性也有可能被限定不能为空(NULL),即便它们并不是当前关系表的主键,但是主要一个属性是关系表的主键,那它的取值绝对不能为 NULL。
4、引用完整性约束(Referential Integrity Constraints)
通过观察发现,在存在多个关系表的关系数据库模式中,数据实体并不会独立存在于单一的关系表中。意思就是,任意一个元组(一个数据实体)必然在各个关系表中存在引用关系。
前面讨论到的三种约束类型,都是针对单一的关系表;引用完整性约束针对的是两个关系表之间的关系,要求指定两个关系表中间的引用关系。
外键(Foreign Key):对于一个关系表 R1 中的属性 A,取任意一个 R1 中元组,在另一个关系表 R2 中都会存在一个元组,其属性 B 的取值与 A 相等。这种情况下,我们把属性 A 叫做关系表 R1 的外键,R1 叫做引用关系(Referencing Relation),R2叫做依赖关系(Referenced Relation)。
举个例子说明一下
在上面的关系数据库模式中,我们可以找出关系表 ENROL 的两个外键:
- [ CourseNo ] ⊆ COURSE [ No ]
- [ StudentID ] ⊆ STUDENT [ StudentID ]
容易违反约束条件的几种情况
- 插入操作(Insert)
- 删除操作(Delete)
- 更新操作(Update / Modify)
原文地址:https://www.cnblogs.com/wymanwong/p/11516729.html
- PHP开发过程的那些坑(四) ——PDO bindParam函数
- iBatis.Net(3):创建SqlMapper实例
- PHP开发过程的那些坑(五) ——PHP的empty()
- iBatis.Net(2):基本概念与配置
- ASP.NET Web API中的依赖注入什么是依赖注入ASP.NET Web API依赖解析器使用Unity解析依赖配置依赖解析
- 解决Entity Framework查询匿名对象后的跨域访问的一种方式
- WebSocket在ASP.NET MVC4中的简单实现
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式第一种方法第二种方法第三种方法
- Unity Container中的几种注册方式与示例1.实例注册2.简单类型注册
- 使用Unity创建依赖注入依赖注入生命周期:注册、解析、销毁 注册解析销毁
- 使用WCF进行跨平台开发之三(JAVA调用WCF服务)1.开发必备2.生成WCF客户端3.开发程序4.结束语
- 使用WCF进行跨平台开发之二(IIS托管WCF服务并使用php平台调用)1.系统必备2.在IIS中托管WCF服务3.使用PHP调用托管在IIS中的WCF服务
- 使用WCF进行跨平台开发之一(WCF的实现、控制台托管与.net平台的调用)1.创建项目结构2.契约的设计3.实现服务4.控制台托管服务5.在.net平台中调用WCF
- 使用GUI工具高效构建你自己的Nuget包丰富包的基础信息添加要包含的文件The end
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 对storm1.2.3并行度的理解
- RabbitMQ集群搭建过程
- java中的reference(一): GC与4种基本的Reference(强软弱虚)
- java中的reference(三): FinalReference和Finalizer的源码分析
- 【ceph】性能测试工具cosbench(1)
- linux命令tree的使用
- 腾讯云V3签名方法之iOS
- Go语言学习之 panic 和 recover
- Go语言学习之函数
- 【Spark Operator】webhook的分析
- 图解人脸识别算法facenet系列(一)
- Go 语言学习之 struct
- Go 语言学习之map
- 前端|利用手机号登录获取手机验证码
- Linux netstat命令结果分析