本文主要讲解了部分关系数据理论,以及关系查询出林和查询优化的相关问题。
并介绍了批量修改数据库引擎的方法。
6.关系数据理论
一对一,外键唯一,外键加unique约束
一对多,二张表,多的表加外键
多对多,三张表,关系表两个外键
规范化
实体 | 现实世界中客观存在并可以被区别的事物 | 比如“一个学生”、“一本书” |
属性 | “实体所具有的某一特性”,可以看作是“表的一列” | 比如说,“性别”是“人”的一个属性 |
元组 | 表中的一行就是一个元组。 | |
分量 | 元组的某个属性值 | |
码 | 表中可以唯一确定一个元组的某个属性(或者属性组)。如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。 | |
全码 | 如果一个码包含了所有的属性,这个码就是全码 | |
主属性 | 一个属性只要在任何一个候选码中出现过,这个属性就是主属性 | |
非主属性 | 没有在任何候选码中出现过,这个属性就是非主属性 | |
外码 | 一个属性(或属性组),它不是码,但是它别的表的码,它就是外码 |
函数依赖:自变量x确定后,相应的函数值y也就唯一确定了。
完全函数依赖:,对于任何一个X的真子集,都不能推出Y,则称Y对X 完全函数依赖。
部分函数依赖:X的真子集可以推出Y。
for example: 是完全函数依赖, 是部分函数依赖。因为 .
1NF(第一范式):每一个分量是不可分的数据项 [有主键,字段不可再分]
2NF(第二范式):不产生部分函数依赖
3NF(第三范式):不产生传递依赖
BCNF:
- 所有非主属性对每一个码都是完全函数依赖
- 所有主属性对每一个不包含它的码也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
只有一个候选码且满足了 3NF则一定属于BCNF
关系模式C(Cno,Cname,Pcno) 只有一个码,没有任何属性对Cno部分依赖或传递依赖,所以 .且Cno是唯一决定C的因素,所以 .关系模式S(Sno,Sname,Sdept,Sage) 假设Sname也具有唯一性,那么S就有两个码,这两个码都由单个属性组成。其他属性不存在对码的部分依赖或传递依赖,所以.且除了Sno、Sname外没有其他决定因素,所以。
7.数据库设计
7.5物理结构设计
关系模式存取方法选择
数据库管理系统一般提供多种存取方法,常用的存取方法为索引方法和聚簇方法。
B+树索引和hash索引是经典的存取方法。
聚簇:为了提高某个属性(或属性组)的查询速度,把这个或这些属性上具有相同值的元组集中存放在连续的物理块中称为聚簇。这些属性(或属性组)称为聚簇码。
for example:要查询信息系所有学生名单,该信息系有500名学生,在极端情况下,这500名学生所对应的数据元组分布在500个不同的物理块上,尽管对学生关系已按所在系建立索引,由索引可以很快找到信息系学生的元组标识,避免了全表扫描,然而在由元组标识去访问数据块时就要存放500个物理块,执行500次I/O操作。如果将同一系的学生元祖集中存放,则每读一个物理块可以得到多个满足查询条件的元组,从而显著减少了访问磁盘的次数。
一个数据可以建立多个聚簇,一个关系只能加入一个聚簇
9.关系查询处理和查询优化
9.1查询处理
一般情况下,当选择率较低时,基于索引的选择算法要优于全表扫描算法。但在选择率较高或者要查找的元组均匀的分布在要查找的表中,这时基于索引的选择算法性能不如全表扫描算法。(因为除了对表的扫描操作,还要加上对B+树索引的扫描操作,对于每一个检索码,从B+树根节点到叶子结点路径上的每一个节点都要执行一次I/O操作。)
9.2查询优化
见书上例题【例9.3】P280
有选择和连接操作时,应先选择,后连接。(笛卡尔积消耗贼大)
9.3代数优化
启发式法则:
- 选择运算尽可能先做
- 把投影运算和选择运算同时进行
- 把投影同其前或后的双目运算结合起来
- 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
- 找出公共子表达式
批量修改数据库引擎
参考链接
Navicat默认数据库引擎为MYISAM
,所以添加外键的时候需要将数据库的引擎设置为INNODB
,但是这个时候你建的表很多的话,很难一个一个修改,所以需要批量修改数据库的引擎。
-- 查询数据库表引擎 mei_tuan是用到的数据库 复制过去直接改数据库名字即可
select * from information_schema.tables
where table_schema = 'mei_tuan'
and engine='MYISAM';
-- 生成批量修改的sql语句
USE mei_tuan;
SELECT GROUP_CONCAT(CONCAT('ALTER TABLE',TABLE_NAME,' ENGINE=INNODB; ') SEPARATOR '')
FROM information_schema.TABLES AS t
WHERE TABLE_SCHEMA='mei_tuan'
AND TABLE_TYPE = 'BASE TABLE'
AND ENGINE = 'MyISAM';
-- 查看权限
show global variables like 'local_infile';
-- 开启权限
set global local_infile='ON';
-- 管理员信息表
LOAD DATA LOCAL INFILE 'D:\\tbs\\administer.csv' INTO TABLE administer
FIELDS TERMINATED by ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES -- 忽略表头,即表头不插入
(col1,col2,...); --指定字段
-- FIELDS TERMINATED 指定分隔符
常见问题:
1.导入的路径名称不能有中文 , 路径是D:\\tbs\\administer.csv
或者D:/tbs/administer.csv