数据库——表间关系、多表查询及三大范式

表和表之间关系

表和表【实体】之间的关系有3种:

一对一1:1,例如一个人只能有一个身份证,一个身份证只能属于一个人

一对多或者多对一1:m或者m:1,如一个类目可以包含多个商品,一个商品只能属于一个类目

多对多n:m,例如一个学生可以选修多门课程,一个课程可以被多个学生选修

考察表【实体】之间关系的方法:中立

多表查询

        多表查询可以分为连接查询子查询两大类

连接查询

        以标准sql为依据进行学习,连接查询可以分为3大类:交叉连接、内连接、外连接

交叉连接 交叉连接返回的结果就是连接的两个表中所有数据行的笛卡尔积,从表A中获取任意一行数据,和表B所有行无条件匹配。例如A表中2条数据,B表中3条数据,则查询结果为6条数据【2*3

        语法1select * from tb_emp,tb_dept

        语法2select * from tb_emp cross join tb_dept 推荐写法

内连接

内连接又可以称为简单连接或者自然连接【mysql有特殊语法】,内连接使用比较运算符对两个表中的数据进行比较,并获取与连接条件相匹配的数据行

内连接根据所使用的比较运算符可以分为等值内连接不等值内连接两大类

外连接

外连接就是返回的查询结果不仅满足包含符合连接条件的数据,还需要包含其中一个表或者两个表中的所有数据,如果不满足条件条件的一方显示为null

外连接可以分为左外连接、右外连接和全外连接,但是mysql不支持全外连接,oracle支持

子查询

        子查询就是指一个查询语句嵌套在另外一个查询语句内部的查询。在执行时先执行子查询中的语句,然后将返回的结果作为外层查询的一部分执行

in关键字

exists关键字

exists后面的参数可以是任何一个子查询,这个子查询不产生任何数据,只返回true或者false,当返回true时外层查询才会执行

any关键字

any表示满足内层子查询中的任意一个条件,就返回一个结果作为外层查询的条件

比较运算符子查询

在进行包含子查询的比较查询时也可以使用=进行比较。注意使用=或者!=时子查询只能返回一个值,否Error 1242


范式NF

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不 同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有5+1级范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式 (BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。如果不满足所要求 的范式,则将不满足范式要求的部分进行分表。

一般说来,数据库只需满足第三范式(3NF)就行了。

数据库设计中的概念

实体:现实世界中客观存在并可以被区别的事物。比如一个学生一本书一门课等等。值得 强调的是这里所说的事物不仅仅是看得见摸得着的东西,它也可以是虚拟的,不如说老师与学 校的关系

属性:教科书上解释为:实体所具有的某一特性在关系数据库中,属性又是个物理概念,属性可以看作是表的一

元组:表中的一行就是一个元组。

分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作 的时候,属性是不可分的。否则就不是关系数据库了。

:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么叫候 选码,从候选码中挑一个出来做老大,它就叫主码。

全码:如果一个码包含了所有的属性,这个码就是全码。

主属性:一个属性只要在任何一个候选码中都出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

候选码: 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何真子集都不能再标 识,则称该属性组为(超级码)候选码。

主键的定义

主键可分为2大类:自然主键和代理主键。一般建议使用代理主键

将表中的所有列的组合当作主键--候选码

去除其中某些列查看是否还能唯一标识一行数据

最后找到的所有候选码的真子集就是主码

NF1

所有列不可分,字段满足原子性

定义学生,学生(编号、班级编号、姓名、亲属),这个亲属列是可分的,所以将亲属列划分到另外表中,从而使剩余的列满足NF1,最终结构选择为 学生(编号、班级编号、姓名)、学生亲属(姓名、关系、外码)

NF2

消除对主键的部分依赖

定义学生,学生(编号、班级编号、姓名、宿舍楼号),主键为复合主键(编号、班级编号),这里会发现一旦班级编号确定则所属的系别就确定,系别确定则宿舍楼号确定。宿舍楼号部分依赖主键,不是依赖整个主键。解决问题的方法为分表 学生(编号、班级编号、姓名) 学生住宿 (班级编号、宿舍楼号)

NF3

消除对主键的传递依赖

定义学生,学生(学号pk、系别、宿舍楼号),主键为学号,所以自然满足NF2,但是一旦系别确定则宿舍楼号确定,所以宿舍楼号依赖于系别,不是依赖于学号。这里就是传递依赖:宿舍楼号-->系别-->pk。解决问题的方法为分表

范式和反范式

应用范式可以减少数据冗余,但是范式级别越高,则创建表的数量越多,查询效率则越低。所以在具体开发中经常采用降低范式要求,采用合理冗余数据的方式以提高查询效率

考虑查询效率,所以一般只达到NF3即可,甚至有时会了提高查询效率会有意降低范式要求【反范式】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值