1. 3NF 与 BCNF 的差异,BCNF 要求每个非平凡函数依赖的左侧都是超键?
第三范式(3NF)与鲍依斯-科德范式(BCNF)的差异是什么?为什么 BCNF 要求每个非平凡函数依赖的左侧都是超键?
- 3NF 与 BCNF 的精确定义
- BCNF 比 3NF 更严格的原因
- 非平凡函数依赖左侧为超键的含义
3NF 要求消除非主属性对候选键的传递依赖,即每个非主属性既不部分依赖也不传递依赖任何候选键;等价地,对每个非平凡函数依赖 X→Y,要么 X 是超键,要么 Y 是主属性(即 Y 属于某个候选键)。BCNF 则要求每个非平凡函数依赖 X→Y 的左侧 X 都必须是超键,不区分 Y 是否为主属性。因此 BCNF 是 3NF 的严格强化:任何 BCNF 关系都满足 3NF,但反之不然。举例如关系 R(仓库, 物品, 管理员),若存在 "仓库→管理员" 且候选键为 (仓库,物品),则 "仓库→管理员" 的左侧不是超键,但管理员是主属性,所以该关系满足 3NF 却不满足 BCNF,仍存在冗余(每个仓库的管理员重复存储)。
BCNF 通过"左侧必须是超键"这一更严格条件,彻底消除了由主属性之间的依赖导致的冗余。3NF 允许"左侧非超键但右侧是主属性"的依赖,这是为了换取依赖保持性(BCNF 分解可能丢失依赖保持),实践中若业务对冗余敏感则优先 BCNF。
-- 演示 3NF 但非 BCNF 的关系(冗余随时间产生)
CREATE TABLE Warehouse_Keeper (
warehouse_id INT,
item_id INT,
keeper_name TEXT,
PRIMARY KEY (warehouse_id, item_id)
-- keeper_name 由 warehouse_id 决定,但 (warehouse_id) 非超键
-- 因此满足 3NF 不满足 BCNF
);