r1和r2交集是A,对A求闭包可以推出全集,故一定是无损分解。
A->B、C->B、AC->B
a.Pk(student) → Pk (instructor) 、Pk(instructor) → Pk(student)
b.Pk(student) → Pk(instructor)
A, BC, CD 和 E. 先判断一个字母的,A和E很容易判断出是候选码,那么包括AE的且比A,E大的就不可能是候选码,然后判断B C D 的组合是否可能构造出候选码。
我们求正则覆盖的时候虽然要先把右侧分解成单属性,但是求好的正则覆盖要求左侧属性不能相同。如A->B A->C 必须要合并为A->BC这样。
// a.
select * from R group by b having count(distinct c) > 1
// b.
create assertion b_to_c check(
not exists(
select * from R
group by b
having count(distinct c) > 1
)
)
无损分解要保证分解后的关系在经过自然连接后得到的关系要与分解前的关系是等价的。如果左侧出现了空值,那么在自然连接的过程中会把这些空值过滤掉,导致分解是有损的。
B->D CD->E都没保持依赖
(B,D)、(A,B,C,E)
(A,B,C)、(C,D,E)、(B,D)、(A,E)
A | B | C |
---|---|---|
a1 | b1 | c1 |
a1 | b1 | c2 |
a->bc 则a->b 且 a->c
证明:
a->bc
bc->b
a->b
bc->c
a->c
无损分解,保持依赖,最大程度减少数据冗余
因为我们可以准确维护数据库,快速检查更新的正确性,并节省空间。
标签:bc,数据库,第六版,分解,student,Pk,习题,instructor,无损 From: https://blog.csdn.net/weixin_59659714/article/details/144639935因为BCNF不一定能做到保持依赖,所以我们选择3NF来达到无损分解和保持依赖。