什么时候BCNF分解不能保留功能依赖...我试图解决这个问题,比如R =(V,W,X,Y,Z)
答案 0 :(得分:5)
取自Database Design and Relational Theory:
R = (S, J, T)
{S, J} -> {T}
{T} -> {J}
这不在BCNF中,因为T -> J
成立且T
不是关键。
将R1 = (T, J)
和R2 = (T, S)
分解为{T}
,{T, S}
为密钥。导致BCNF。
但是,依赖项{S, J} -> {T}
将丢失。
答案 1 :(得分:1)
BCNF分解的重点是消除 not 形式key -> everything else
因此,如果一张桌子有FD,请说A - > B,这样A不是键,这意味着你在表中存储冗余数据。因此,您创建一个包含A列和B列的新表,其中A为键,然后从原始表中删除B.
由于此更改,您将不再遭受删除异常,也不必更新多行只是为了更改A - > B关系。
因此,对于一个琐碎,天真的例子,假设您有一个包含列的员工表:
employeeId name jobTitle salary
假设jobTitle -> salary
即具有相同职位的每个人总是赚取相同的薪水。假设“开发人员”的职称等同于90,000美元的薪水。如果您的数据库中有20个开发人员,那么为每行存储相同的$ 90,000冗余值将是愚蠢的。因此,您从employees表中删除salary列,并使用以下命令创建新的工资表:
jobTitle_[key] salary
然后,要获得员工的工资,请在工资表中查找。
答案 2 :(得分:1)
答案 3 :(得分:0)
Schema R=(V,W,X,Y,Z)
Functional dependencies:
V,W -> X
Y,Z -> X
W -> Y
分解为BCNF,您将看到所有FD都无法在单个分解中保留。