王珊老师的《数据库系统概论》里的第二范式,即2NF的定义:若关系R满足1NF,且每一个非主属性完全函数依赖于码,则关系R满足第二范式。
疑问如下:
码的定义:K为关系R的属性或属性组,R的属性集U(U是R的所有属性)完全依赖于K,则K就是关系R的码。既然关系中的所有属性都完全依赖于码,那肯定非主属性一定是完全依赖于码的,只要将关系R的码存在,那么非主属性一定是完全依赖于码的,一定满足第二范式,怎么会有关系的码存在但是非主属性部分依赖码的情况呢?如果存在,那岂不是和码的定义相矛盾了?求伙伴解惑;
例如:关系模式 {学号,课程号,课程名,成绩}
主属性为学号,课程号 ,其中{学号,课程号}→课程名,但是课程号就可以决定课程名,这属于部分依赖。
第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。
可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。
第二范式
定义:每个非主属性由整个主键函数决定,不能由主键的部分决定。非关键字段对主键完全依赖,消除部分函数依赖。即存在组合关键字中的字段决定非关键字的情况。
第二范式就相当于,外键的应用
码的定义:表中所有属性完全函数依赖于的属性或属性组。。。。。
你确定码的定义是这样?码,理解为候选码,一个属性(组)可以唯一确定一个元组,且其子集不行则为候选码。
如果你看书的话,书中例图应该可以很好的解释为什么有的不满足2NF
2NF是不允许部分依赖, 即a b c d四项 ab->c a->d 是不满足2NF的,主键之外的项不能由主键的一部分得到.
BCNF是不允许传递依赖 即ab c d ab是主键 ab->c ab->d 但是c->d 就不满足BCNF.
bcnf允许主键的一部分由其它项推出即 c->a,同样若这个也不允许则就满足了3nf.
望采纳,还有问题可以继续追问.
从图中可知码的定义:表中所有属性完全函数依赖于的属性或属性组,确实是这样定义的。
既然关系中的所有属性都完全依赖于码,那肯定非主属性一定是完全依赖于码的(错),只要将关系R的码存在,那么非主属性一定是完全依赖于码的,一定满足第二范式,怎么会有关系的码存在但是非主属性部分依赖码的情况呢?
此图中非主属性Sloc部分依赖码。
书上的图,楼主按顺序看书就能理解吧。