我知道要转换为 BCNF,我们需要考虑所有违规行为并根据需要对每个 FD 进行分解。
例如,如果我们有 R(A,B,C,D) 和 FD 的 AB->C, B->D, C->A。我们可以计算每个的闭包,{AB}+ = ABCD,{B}+ = BD,{C}+ = CA。
在通过算法之后,有效分解为 BCNF 将是 R1(B,D)、R2(C,A)、R3(B,C)。
我感到困惑的是,虽然这种分解在算法之后似乎是正确的,但如果第一个函数依赖 AB->C 似乎不被满足,它怎么可能是正确的?
我知道要转换为 BCNF,我们需要考虑所有违规行为并根据需要对每个 FD 进行分解。
例如,如果我们有 R(A,B,C,D) 和 FD 的 AB->C, B->D, C->A。我们可以计算每个的闭包,{AB}+ = ABCD,{B}+ = BD,{C}+ = CA。
在通过算法之后,有效分解为 BCNF 将是 R1(B,D)、R2(C,A)、R3(B,C)。
我感到困惑的是,虽然这种分解在算法之后似乎是正确的,但如果第一个函数依赖 AB->C 似乎不被满足,它怎么可能是正确的?
假设我有一张学生表,其中包含他们的 ID、年级和州:
-------------------------
| id | grade | state |
------------------------
| 1 | 83 | CA |
| 2 | 94 | TX |
| 3 | 92 | WA |
| 4 | 78 | CA |
我想要每个州的最高年级学生的 ID(例如 1、2 和 3),我该怎么做?
我知道如何找到最大值(可以做叉积(重命名为 R1 和 R2),然后为那些不是最高的人选择 R1.grade < R2.grade,然后从原始数据库中减去)。但我对如何为每个州做到这一点感到困惑。