BCNF是对第三范式(3NF)的扩展,比3NF稍强。
如果P-> Q是琐碎的功能依赖性,并且P是R的超键,则关系R在BCNF中。
如果在BCNF中存在关系,则意味着基于功能依赖性的冗余已被删除,但仍有一些冗余。
让我们看一个例子-
<体育俱乐部>
地面 | 开始时间 | 时间结束 | 包 |
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 | 银 |
以上关系在1NF,2NF,3NF中,但在BCNF中不存在。这是原因-
功能依赖性 {Package-> Ground}
它的行列式属性Package依赖于Ground既不是候选关键字也不是候选关键字的超集。
<包装>
包 | 地面 |
金 | G01 |
银 | G02 |
青铜 | G01 |
<明天预订>
地面 | 开始时间 | 时间结束 |
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>关系中的键,因此消除了异常。