Boyce–Codd 范式 (BCNF)
rdbmsdatabasemysql
BCNF 是第三范式 (3NF) 的扩展,比 3NF 略强。
如果 P -> Q 是平凡函数依赖关系,且 P 是 R 的超键,则关系 R 符合 BCNF。
如果关系符合 BCNF,则意味着基于函数依赖关系的冗余已被删除,但仍存在一些冗余。
让我们看一个例子 −
<SportsClub>
Ground | Begin_Time | End_Time | Package |
G01 | 07:00 | 09:00 | Gold |
G01 | 10:00 | 12:00 | Gold |
G01 | 10:30 | 11:00 | Bronze |
G02 | 10:15 | 11:15 | Silver |
G02 | 08:00 | 09:00 | Silver |
上述关系符合 1NF、2NF、3NF,但不符合 BCNF。原因如下 −
函数依赖 {Package->Ground
Ground 所依赖的确定性属性 Package 既不是候选键也不是候选键的超集。
<Package>
Package | Ground |
Gold | G01 |
Silver | G02 |
Bronze | G01 |
<TomorrowBookings>
Ground | Begin_Time | End_Time |
G01 | 07:00 | 09:00 |
G01 | 10:00 | 12:00 |
G01 | 10:30 | 11:00 |
G02 | 10:15 | 11:15 |
G02 | 08:00 | 09:00 |
现在上面的表都符合 BCNF 规范。
<Package> 表的候选键是 Package 和 Ground
<TomorrowBookings> 表的候选键是 {Ground, Begin_Time 和 {Ground, End_Time
由于我们在 <Package> 关系中使用了 Package 作为键,因此消除了异常。