什么时候 BCNF 分解不能保留功能依赖性...我试图弄清楚这个说 R=(V,W,X,Y,Z)
4 回答
取自数据库设计和关系理论:
R = (S, J, T)
{S, J} -> {T}
{T} -> {J}
这不在 BCNF 中,因为T -> J
它持有并且T
不是密钥。
将其分解为键R1 = (T, J)
和键。导致 BCNF。R2 = (T, S)
{T}
{T, S}
但是,依赖关系{S, J} -> {T}
丢失了。
BCNF 分解的重点是消除不属于形式的函数依赖key -> everything else
因此,如果一个表有一个 FD,比如 A -> B,这样 A 不是键,这意味着您在表中存储了冗余数据。结果,您创建了一个包含列 A 和 B 的新表,其中 A 是键,然后从原始表中删除 B。
由于此更改,您将不再遭受删除异常的困扰,也不必为了更改 A -> B 关系而更新多行。
因此,对于一个简单、幼稚的示例,假设您有一个包含列的员工表:
employeeId name jobTitle salary
假设也就是说jobTitle -> salary
,每个拥有相同职位的人总是获得相同的薪水。假设“开发人员”的职位名称相当于 90,000 美元的薪水。如果您的数据库中有 20 个开发人员,那么为每行存储 90,000 美元的相同冗余值将是愚蠢的。因此,您从员工表中删除薪水列,并创建一个新的薪水表:
jobTitle_[key] salary
然后,要获得员工的薪水,您可以在薪水表中查找。
R(abcde) 与 FD { A->B,AC->D,BD->E}。在这种关系中,AC 是候选键,并且这种关系不在 2NF 中,因为非素数 B 部分依赖于键(AC)。将此关系转换为 bcnf 分解为两个关系: R1(ab ) {a->b} key = a R2(acde) {ac->de} key =a R1 和 R2 都在 bcnf 中,因为每个行列式都是一个 key ,但它们不是依赖保留,因为 bd->e 丢失了。
Schema R=(V,W,X,Y,Z)
Functional dependencies:
V,W -> X
Y,Z -> X
W -> Y
分解为 BCNF,您将看到所有 FD 都不能保存在一次分解中。