三个范式的解释

第一范式[1NF]
定义:仅当所有基本的简单域只包含原子数值,具有这种关系的被认为符合第一范式。
使用更加实际可用的术语来定义第一范式。实际可以分为2部分。第一部分就是字段中的任何值都必须是原子的。不符合第一范式一个例表如下
ID suppler_products  price
-------------------------------------------------
1 lenox serving platter  156.95
2 mikasa serving platter  93.95
3 noritake serving platter 206.95
因为suppler_products字段中的值包括2个不同得数据元素:供应商以及他们所供应得产品。我们需要采取下面的步骤来解决这个问题:
ID serving platter  lenoxprice mikasaprice noritakeprice
---------------------------------------------------------------------------------------------------
1 serving platter  156.95  93.95  206.95
但是这个解决办法又违反第一范式的第二部分,要求原子值不能在不同的字段中分散出现,在这种情况下,价格就是一个原子值,但是我们已经把它分散到三个部分中。最后我们可以采取下面的方法使其满足第一范式得要求:
products
ID Name
-------------
1 servingplatter

suppliers
ID ProductID Name  Price
-------------------------------------------------
1 1  lenux  156.95
2 1  mikasa  93.95
3 1  noritake 206.95
分别创建两个单独得表,现在我们就由了一个具有原子数据得price字段:价格。

第二范式[2NF]
定义:当且仅当满足第一范式,而且每一个非关键属性都完全依赖与其主关键码,具有这种关系的被认为符合第二范式。
检验上products表,我们发现它满足第二范式。其键码是ID,因此唯一的非关系属性是Name。Name完全依赖于用来识别不同产品的ID字段。
如果我们来看suppliers表,会发现它不满足2NF.而且,Name完全依赖于ID字段,因为后者是用来识别不同供应商的键码字段。不过,非键码得ProductID和Price字段都不完全依赖与ID字段,比方说并不是所有得Lenux产品的价格都是156.95元。我们需要添加第三个表以满足2NF并且要保留各表之间的关系和数据:
products
ID NAME
--------------
1 serving platter

suppliers
ID Name
--------------------
1 lenux
2 mikasa
3 noritake

products_suppliers
productID supplierID price
-------------------------------------------
1  1  156.95
1  2  93.95
1  3  206.95
这里,products表与上一个products表相同。products.name仍然完全依赖于products.ID,因此它满足2NF。suppliers现在也满足2NF,因为它具有一个键码字段和一个完全依赖于它的非键码字段。products_suppliers具有一个productID和supplierID字段组成的组合键码。唯一得非键码字段是price,并且完全依赖于键码。

第三范式[3NF]
定义:当且仅当满足第二范式,而且每一个非关键属性都非传递依赖与其关键码,具有这种关系的被认为符合第三范式。
现在为该例添加供应商得电话号码,如下:
products_suppliers
productID supplierID price  supplierphone
----------------------------------------------------------------
1  1  156.95  3013344
1  2  93.95  3024455
1  3  206.95  3035566
现在该表还满足1NF,因为它所有字段都是原子的。该表还满足2NF,price和supplierphone字段都依赖与键码。但它不再满足3NF。supplierphone字段还依赖于键码,但仅仅是部分依赖。也就是说,它依赖与键码的supplierID字段部分而不是productID字段部分。该解决方案应该非常明显:我们需要吧supplierphone字段从products_suppliers表重转移到suppliers表中。
posted @ 2006-09-21 23:01  释天  阅读(3219)  评论(1编辑  收藏  举报