一、sql语句
1、主码: 唯一标识元组 ; 一个表只能有一个主键,主键从候选码中选一个
超码 : 可以唯一标识元组的属性组合
候选码: 超码中最小闭包,即不能在小化的超码
外码: r2主码:m ,r1主码n,含有属性m, 则m是r1上参照r2的外码地
外键写法: foreign key (Wai_ma ) reference R2;
2、建表数据基本类型
char(n) 固定长度 varchar(n) 可变长度 numeric(m, n) m位数,n位小数
3、 关系点数
1) 除号: 例如:R /S,表示选择R中与S相关的所有集
2)聚集函数表示法: 在函数前+G,将需要GroupBy的属性放在G前面,比如 a1,a2Gsum(age)(···)
3)更名运算 Px(d) x为新名
4) 左、右、全外连接: 左外连接表示左边表与右边不匹配的元组,自动地将右边的属性赋值为空然后加入到新表中
二、 E-R图设计
1、实体集
联系集 : 不同实体或实体集之间的联系的集合 , 联系集可有有描述性属性。】
属性:分类: 简单、复合属性
单值和多值属性
派生属性: 即通过某种属性的实体派生得来的 如 具有某种属性的实体的数量
2、参照约束 : 指的是实体集中并非所有实体都通过联系集
3、从实体集中删除冗余属性:
1)删除外码,保留主码
4、E-R设计:(关系模式)
实体集:(属性,属性) // 主码以下划线表明
联系集:
5、E-R图
1 如何表示一对多、多对一、多对多
箭头:箭头为1,线段为多
映射基数: 位于实体集与关系集上线段
l..h l表示最小的映射基数, h表示最大 可以用*表示,表示为没有限制
如: 1..1 表 一对一 ,0,,* 表示己实体可以对应0个也可以对应不限量的彼实体
如何表示属性全部参与: 双线
2)如何表示实体在联系集中的参与度 双线 表示全部参与
3)如何表示连接到弱实体集的标志j性联系集 双线菱形
4) 如何表示复合、多值、派生属性 ; 多值:{多值属性名} ; 派生: 派生属性名+()
5)弱实体集: 没有足够的属性构成主码的实体集,相反,有主码的成为强实体
6)标识实体集:能标识弱实体,弱实体依赖于标识实体集
6、E-R图与E-R关系模式的转换
1) 如何转换多值属性强实体集: 用子值代替赋值表示。
2)弱实体集表示: 本身属性加上所依赖标识实体集的主码
3)联系集的表示: 由实体集中的主码和联系集上的描述属性组成,该模式上的主码在实体集中的主码中选(一对一,任选一个;一对多,选多个;多对多,全选)
;链接弱实体与强实体的联系一般不用给出 (若给出,弱实体的主码的其属性加上依赖实体的主码)
三、关系数据库设计
1、第一范式: 即关系模式没有子结构(即复合属性,多值属性)
第二范式:满足第一范式的前提下,主关键字都是单值,则一定是第二范式;若不是,则非关键字一定只能依赖于组合关键字,不能依赖于其他非关键字。
2、使用函数依赖进行分解
1)函数依赖: a , b为是一个属性集, 两个元组中,a属性相等,可以推出b属性也相等,则说明a->b ,这称为一个函数依赖集。
2)函数依赖的写法: (属性)->R
3) F(一个函数依赖集) F+称为F的闭包,即有F可推出的所有依赖集的集合。
3、BCNF (Boyce-Codd Normal Form范式)
1)判断具有函数依赖集F的关系模式R满足属于BCNF范式的条件:对所有F+中形如a->b的函数依赖集,下面至少有一项成立
· a->b是平凡依赖集(b包含于a)
· a是模式R的一个超码
4、 BCNF和保持依赖
5、第三范式 3NF
1)
如何
判断具有函数依赖集F的关系模式R满足属于3NF范式的条件:对所有F+中形如a->b的函数依赖集,下面至少有一项成立
· 平凡依赖
· a是R的一个超码
· b-a的每一个属性a都包含于R的一个候选码中。
也可以说,非主键必须直接依赖于主键,而不能依赖于非主键列,不能存在传递依赖。
问题: 如何判断是包含于一个候选码中
6、函数依赖理论
1)函数依赖集的闭包 : 即满足F的实例也满足f,则f被F逻辑蕴含
2)F的闭包,即F+
3)蕴含逻辑公里推理 (即离散数学中的蕴含逻辑公式
4)属性集的闭包
计算a+: 就是根据a吧所有a能推出的蕴含结果取并集。
检验a是否为超码: a+是否包含所有R的属性
5)正则覆盖率(canonical cover)
作用: 减少检测数据库更新后是否韩满足函数依赖集的工作开销
无关属性: 即去掉之后不改变闭包的值
F的正则覆盖Fc定义: Fc闭包和F一样 , Fc的函数依赖左边式唯一 , 即a->b a只会出现一次 不会再有a->出现; Fc不含无关属性。
问题:1、 如何计算F的正则覆盖,2 如何判断无关属性
1、 合并左边相同的依赖集 2、删除无关属性
2、 结果相同,查看左边是否有冗余 ,即去掉左边一个属性能否依旧得到右边; 右边多项,查看去掉一项是否结果相同,即是否有由左边单个属性即可得到的属性,如ab->cf, a->c, 即能把c去掉;或者是右边中有一个属性能推出另一个属性,如ac->bd
,b->d,即可把d去掉;
6) 无损分解
如何判断分解是否无损
如果R1交R2是R1或R2的超码,则R上分解是无损的。
7) 保持依赖 :
分解之后是否还保持依赖集
7、分解算法
1)BCNF分解 (分解出几个关系模式否属于BCNF,且无损)
判定一个关系是否属于BCNF
1、对于a->b函数依赖,计算a+是否包含所有属性,即判断是否是超码
2、判断所有函数依赖集是否违反BCNF判断条件
判定一各关系分解后的关系Ri是否还属于BCNF
分解方法:
1、 找出 R(关系模式)中不属于BCNF的Ri (即左边a不是超码)
2、令a->b为一个在Ri成立的函数依赖, 且满足a->Ri 属于F+ 且a交b为空集 那么关系模式分为 (R-b)和(a,b)
(a,b)一定属于(BCNF) 然后重复1 2 步骤
8、 3NF分解
1)计算Fc(正则覆盖)
2) 循环所有Fc中的依赖集, 合并a和b为一个属性集,R1,R2,··,Ri
3)判断Rj (j属于1~i)是否包含候选码
若没有, 则创建Ri+1 (即新建一个数据集)有候选码组成 (候选码人选)
4) 判断在各属性集中是否有一个属性集包含于另一个属性集
若有, 则令被包含的那个属性集等于Ri+1(即最新建的属性集) ,然后删除Ri+1