查看“︁第三正規化”︁的源代码
←
第三正規化
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{noteTA |T=zh-cn:第三范式; zh-tw:第三正規化; zh-hk:第三規範化; |1=zh-cn:规范化;zh-tw:正規化;zh-hk:規範化; |2=zh-cn:范式;zh-tw:正規化;zh-hk:範式; |3=zh-cn:依赖;zh-tw:相依;zh-hk:依賴; |4=zh-cn:数据库规范化;zh-tw:資料庫正規化;zh-hk:資料庫規範化; }} {{Proofreader needed|en|Third normal form}} '''第三范式'''(3NF)是[[資料庫正規化]]所使用的[[数据库规范化|正規形式]],要求所有非主鍵屬性都只和[[候選鍵]]有相關性,也就是說非主鍵屬性之間應該是独立無關的。 如果再對第三正規化做進一步加強就成了[[BC正規化]],強調的重點在於「資料間的關係是奠基在主鍵上、以整個主鍵為考量、而且除了主鍵之外不考慮其他因素」。 ==正規定義== 令: * <math>{R}</math> 表一個關係; * <math>F</math> 表維持 <math>R</math> 所需的一組[[函数依赖]]; * <math>X</math> 表 <math>R</math> 屬性的[[子集合]]; * <math>A</math> 表 <math>R</math> 的一個屬性 最早由[[埃德加·科德]]在1971年给出的第三范式定义为<ref name="Codd">Codd, E. F. "Further Normalization of the Data Base Relational Model". (Presented at Courant Computer Science Symposia Series 6, "Data Base Systems", New York City, May 24–25, 1971.) IBM Research Report RJ909 (August 31, 1971). Republished in Randall J. Rustin (ed.), ''Data Base Systems: Courant Computer Science Symposia Series 6''. Prentice-Hall, 1972.</ref>: * 关系R(表)满足[[第二范式]] (2NF); * R的每个非键属性是R的每个候选键的非传递依赖。 Carlo Zaniolo于1982年给出的一个等价定义为<ref name="Zaniolo">Zaniolo, Carlo. "A New Normal Form for the Design of Relational Database Schemata". ''ACM Transactions on Database Systems'' 7(3), September 1982.</ref><ref>Abraham Silberschatz, Henry F. Korth, S. Sudarshan, ''[http://www.db-book.com/ Database System Concepts] {{Wayback|url=http://www.db-book.com/ |date=20201105200007 }}'' (5th edition), p. 276–277.</ref>: 如果對於 <math>X \to A</math> 這種型式的函数依赖而言,下列敘述任一為真的話,則可以稱 <math>R</math> 符合第三正規化: * <math>A \in X</math>;也就是說 <math>A</math> 是[[明顯函数依赖]] * <math>X</math> 是[[超鍵]] * <math>A</math> 是 <math>R</math> 的[[候選鍵]]的一部份 任何一個具有[[部份相依性]]或是[[轉移相依性]]的關係都違反了第三正規化。 ==範例== 以下面這個定義機械元件的關係為例: {| align="center" border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse; border: 1px solid black" |+ 機械元件 |- style="background-color: silver; text-align: left; vertical-align: top" ! style="border: 1px solid black" | 元件編號<br/>(主鍵) ! style="border: 1px solid black" | 製造商名稱 ! style="border: 1px solid black" | -{zh;zh-hant;zh-hans|製造商地址}- |- | style="border: 1px solid black" | 1000 | style="border: 1px solid black" | Toyota | style="border: 1px solid black" | Park Avenue |- | style="border: 1px solid black" | 1001 | style="border: 1px solid black" | Mitsubishi | style="border: 1px solid black" | Lincoln Street |- | style="border: 1px solid black" | 1002 | style="border: 1px solid black" | Toyota | style="border: 1px solid black" | Park Avenue |} 本例中-{zh;zh-hant;zh-hans|製造商地址}-很明顯地不該被列在這個關係裡面,因為和元件本身比起來,-{zh;zh-hant;zh-hans|製造商地址}-應該和製造商比較有關係;正確的做法應該是把獨立出新的資料表: {| align="center" border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse; border: 1px solid black" |+ 製造商 |- style="background-color: silver; text-align: left; vertical-align: top" ! style="border: 1px solid black" | 製造商名稱<br/>(主鍵) ! style="border: 1px solid black" | -{zh;zh-hant;zh-hans|製造商地址}- |- | style="border: 1px solid black" | Toyota | style="border: 1px solid black" | Park Avenue |- | style="border: 1px solid black" | Mitsubishi | style="border: 1px solid black" | Lincoln Street |} 然後把原本的資料表改成這樣: {| align="center" border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse; border: 1px solid black" |+ 機械元件 |- style="background-color: silver; text-align: left; vertical-align: top" ! style="border: 1px solid black" | 元件編號<br/>(主鍵) ! style="border: 1px solid black" | 製造商名稱 |- | style="border: 1px solid black" | 1000 | style="border: 1px solid black" | Toyota |- | style="border: 1px solid black" | 1001 | style="border: 1px solid black" | Mitsubishi |- | style="border: 1px solid black" | 1002 | style="border: 1px solid black" | Toyota |} 先前那個資料表的問題在於每提到一次製造商名稱就要多存一次它的-{zh;zh-hant;zh-hans|地址}-,而這就不符合第三正規化的原則。 下面提供了另一個例子: {| align="center" border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse; border: 1px solid black" |+ 訂單 (Order) |- style="background-color: silver; text-align: left; vertical-align: top" ! style="border: 1px solid black" | 訂單編號(Order Number)<br/>(主鍵) ! style="border: 1px solid black" | 客戶名稱 (Customer Name) ! style="border: 1px solid black" | 單價 (Unit Price) ! style="border: 1px solid black" | 數量 (Quantity) ! style="border: 1px solid black" | 小計 (Total) |- | style="border: 1px solid black" | 1000 | style="border: 1px solid black" | David | style="border: 1px solid black" | $35.00 | style="border: 1px solid black" | 3 | style="border: 1px solid black" | $105.00 |- | style="border: 1px solid black" | 1001 | style="border: 1px solid black" | Jim | style="border: 1px solid black" | $25.00 | style="border: 1px solid black" | 2 | style="border: 1px solid black" | $50.00 |- | style="border: 1px solid black" | 1002 | style="border: 1px solid black" | Bob | style="border: 1px solid black" | $25.00 | style="border: 1px solid black" | 3 | style="border: 1px solid black" | $75.00 |} 在本例中,非主鍵字段完全依賴于主鍵訂單編號,也就是說唯一的訂單編號能導出唯一非主鍵字段值,符合第二正規化。第三正規化要求非主鍵字段之間不能有依赖關係,顯然本例中小計依赖于非主鍵字段「單價」和「數量」,不符合第三正規化。小計不應該放在這個資料表裡面,只要把單價乘上數量就可以得到小計了;如果想要符合第三正規化的話,就把小計拿掉 (不過在做查詢時, SELECT Order.Total FROM Order 需改成 SELECT UnitPrice * Quantity FROM Order )。 {| align="center" border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse; border: 1px solid black" |+ 訂單 (Order) |- style="background-color: silver; text-align: left; vertical-align: top" ! style="border: 1px solid black" | 訂單編號(Order Number)<br/>(主鍵) ! style="border: 1px solid black" | 客戶名稱 (Customer Name) ! style="border: 1px solid black" | 單價 (Unit Price) ! style="border: 1px solid black" | 數量 (Quantity) |- | style="border: 1px solid black" | 1000 | style="border: 1px solid black" | David | style="border: 1px solid black" | $35.00 | style="border: 1px solid black" | 3 |- | style="border: 1px solid black" | 1001 | style="border: 1px solid black" | Jim | style="border: 1px solid black" | $25.00 | style="border: 1px solid black" | 2 |- | style="border: 1px solid black" | 1002 | style="border: 1px solid black" | Bob | style="border: 1px solid black" | $25.00 | style="border: 1px solid black" | 3 |} ==参考文獻== * Ramakrishnan, Raghu and Johannes Gehrke. "Schema Refinement and Normal Forms." Database Management Systems, Third Edition. ISBN 0-07-246563-8. McGraw Hill. August 14, 2002. * Gupta, Gopal. [https://web.archive.org/web/20070218023436/http://www.cs.jcu.edu.au/Subjects/cp1500/1998/Lecture_Notes/normalisation/3nf.html "Third Normal Form (3NF)."] Single Valued Normalization. 1996. * [http://www.troubleshooters.com/littstip/ltnorm.html Litt's Tips: Normalization] {{Wayback|url=http://www.troubleshooters.com/littstip/ltnorm.html |date=20070210121236 }} * [https://web.archive.org/web/20080805014412/http://www.datamodel.org/NormalizationRules.html Rules Of Data Normalization] * Date, C. J. (1999), ''[https://web.archive.org/web/20050404010227/http://www.aw-bc.com/catalog/academic/product/0,1144,0321197844,00.html An Introduction to Database Systems]'' (8th ed.). Addison-Wesley Longman. ISBN 0-321-19784-4. * Kent, W. (1983) ''[http://www.bkent.net/Doc/simple5.htm A Simple Guide to Five Normal Forms in Relational Database Theory] {{Wayback|url=http://www.bkent.net/Doc/simple5.htm |date=20070202060442 }}'', Communications of the ACM, vol. 26, pp. 120–125 * Date, C.J., & Darwen, H., & Pascal, F. ''[http://www.dbdebunk.com Database Debunkings] {{Wayback|url=http://www.dbdebunk.com/ |date=20200627203408 }}'' ==外部連結== * [http://databases.about.com/od/specificproducts/a/normalization.htm Database Normalization Basics] {{Wayback|url=http://databases.about.com/od/specificproducts/a/normalization.htm |date=20070205184226 }} by Mike Chapple (About.com) * [https://web.archive.org/web/20110606025027/http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html An Introduction to Database Normalization] by Mike Hillyer. * [https://web.archive.org/web/20100106115112/http://www.utexas.edu/its/archive/windows/database/datamodeling/rm/rm7.html Normalization] by ITS, University of Texas. * [https://web.archive.org/web/20110715075109/http://phlonx.com/resources/nf3/ A tutorial on the first 3 normal forms] by Fred Coulson * [https://web.archive.org/web/20071227154911/http://www.marcrettig.com/poster/ Free PDF poster available] by Marc Rettig * [http://support.microsoft.com/kb/283878 Description of the database normalization basics] {{Wayback|url=http://support.microsoft.com/kb/283878 |date=20070210080439 }} by Microsoft * [https://web.archive.org/web/20081221084613/http://www.matthew-west.org.uk/documents/princ03.pdf Developing High Quality Data Models] * [http://www.dama-nj.org/presentations/Kalido_Generic_Data_Modeling.pdf Generic Data Modeling] {{Wayback|url=http://www.dama-nj.org/presentations/Kalido_Generic_Data_Modeling.pdf |date=20070204060514 }} * [http://sourceforge.net/projects/gellish The Gellish Language - A Universal Data Structure] {{Wayback|url=http://sourceforge.net/projects/gellish |date=20070311114010 }} {{-}} {{資料庫正規化}} [[Category:資料庫正規化|3NF]] [[de:Normalisierung (Datenbank)#Dritte Normalform (3NF)]]
该页面使用的模板:
Template:-
(
查看源代码
)
Template:NoteTA
(
查看源代码
)
Template:Proofreader needed
(
查看源代码
)
Template:Wayback
(
查看源代码
)
Template:資料庫正規化
(
查看源代码
)
返回
第三正規化
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息