国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

關系型數據庫:應用第一范式

2024-07-21 02:36:58
字體:
來源:轉載
供稿:網友

  關系型數據庫的理論最早可以追溯到E. F. Codd博士1970年的論文《大型共享數據庫的數據關系模型》,在這篇文章里,他總結出了七條抽象的規則,叫做范式(normal form),用來幫助創建設計良好的數據庫。 這七條規則的前四條——第一范式(First Normal Form,1NF)、第二范式(2NF)、第三范式(3NF)和Boyce-Codd范式(BCNF)——在大多數情況下已經夠用了。
  
  這些范式是非常抽象的,以至于有些開發人員在如何應用它們上存在問題。也許理解范式最好的方式是開始將它們應用于數據,因為規則在你確實有數據要劃分的時候才更有作用。在本文中,我會對一個書目示例數據庫應用1NF的規則,這些規則在一開始應用的時候是最復雜的。
  關于關系型數據庫的理論
  本文是關系型數據庫設計理論系列的第三篇文章。前兩篇文章是:
   《關系型數據庫:理論背后的靈感》
   《關系型數據庫:使用范式創建數據庫》
  你會回憶起,1NF的要求是:
  
  多值字段(multivalued field)必須要被移動到另一個表格里。
  每個字段必須是原子型的(atomic),或者說要盡量地小。
  每個字段都必須有一個要害字(key).
  重復的值必須要被移動到另一個表格里。
  
  我將要使用的簡單表格是用來保存一些書目信息的。到目前為止,這個Books表格有下面這些字段:
  
  {Title, Author, ISBN, PRice, Publisher, Category}
  將多值字段移動到另一個表格
  
  
  
  應用1NF的第一步是確保表格沒有包含多值字段,從定義可知它能夠保存一個以上可能的條目。我們最開始的清單有兩個可能會違反這一規則的地方:Author(作者)和Category(分類)。許多書都有多個作者,所以Author字段就會出問題。類似的,一本書可以被歸入多個類別。例如《金銀島(Treasure Island)》可以被歸為兒童讀物、冒險類、經典類,以及其他類等等。
  
  更正這個問題的唯一方法是把這些違反規則的字段轉移到另一個表格里。你可能會發現字段在另一個已存在表格里工作得會更好,但是這樣的情況非常少見。在大多數情況下,你需要為你所移動的每個字段都創建新的表格。為了滿足1NF的要求,我為Author和Category這兩個字段創建了兩個新的表格,其他的字段都留在Books表格里沒有動:
  
  {Title, ISBN, Price, Publisher}
  
  每個字段都必須是原子型的
  1NF的下一項要求是說,每個字段都必須是原子型的,這就表示每個字段必須保存可能會有的最小數據元素。這條規則有助于搜索和排序。Author字段在這里再一次出現了問題,因為一個名字可以被分成多條信息。我們需要一個字段用于姓,另一個字段用于名,這會讓搜索作者姓名變得輕易得多。
  
  在這一點上,我會更進一步把Authors表格分成至少兩個字段:FirstName(名)LastName(姓),那么我數據庫的布局就是下面這樣的:
  
  Books: {Title, ISBN, Price, Publisher}
  Authors: {FirstName, LastName}
  Categories: {Category}
  
  每個字段都必須有一個要害字
  
  搜索有重復記錄(duplicate record)的表格是很難的;事實上,關系模型不答應表格包含有重復記錄。所以,一個表格里字段或者列的值必須是唯一的。唯一性可以通過檢查key(要害字)來確定,要害字可以由一個單列或者列的組合構成,這樣的列叫做composite key(復合要害字)。
  
  要害字有很多不同的類型:
  
  超要害字(Super key):唯一辨別表格里記錄的一個列或者一組列。
  備選要害字(Candidate key):包含有確定唯一性所需要的最少列的超要害字。
  主要害字(Primary key):用來唯一辨別表格里記錄的備選要害字。
  備用要害字(Alternate key):沒有被選為主要害字的備選鍵。
  外來要害字(Foreign key):表格內匹配同一表格或者另一表格里備選要害字的一個列或者一組列。外來鍵答應你將一個表格里的記錄和另一個表格里的數據相關聯。
  
  這里列出來的要害字的類型并不是相互排斥的;一個要害字可以同時被歸入多個類。從定義上說,每個表格必須至少有一個主要害字。
  
  要確定我們示例表格的主要害字,就讓我們從找到超要害字開始。Authors和Categories表格的超要害字很輕易找到,因為它們的字段非常少,但是Books表格的會稍稍困難一點。盡管兩本書有同一個名字的機會幾乎沒有,但是這不是不可能的,所以我不能把Title(書名)作為Books表格的要害字。兩本書來自同一個出版社具有同一個名字或者具有同一個ISBN的機會應該更小,所以我可以從這些可能性中創建一些超要害字。表A列出了這三個表格的所有超要害字:
  表A
  關系型數據庫:應用第一范式
  示例數據庫的超要害字
  
  
  
  Books表格事實上有更多的超要害字,例如Title、ISBN和Publisher,但是要包含所有這些要害字就又太多了。
  
  
  
  找到備選要害字
  
  現在是縮短超要害字列表來找到備選要害字的時候了,這些備選要害字包含有一個字段里滿足唯一性所需的最少列。Categories表格在這一點上不存在問題,因為它只有一個字段。Authors表格只有一個超要害字,所以很明顯它就是備選要害字。

  
  但是,Books表格有點麻煩,但是在最終的分析里,ISBN字段是備選要害字的最好選擇。ISBN字段應該是唯一的,但是由于這些數字是由出版商來指定的,所以還是可能出現使用同一ISBN的兩本書。實際情況是,只使用ISBN可能永遠也不會碰到問題,但是一旦出現這樣的小錯誤,你的整個數據庫可能都會崩潰。因此,我決定把Title和ISBN這兩個復合超要害字作為Books表格的備選要害字。
  
  確定主要害字
  
  主要害字只不過是你最后用來唯一辨別表格里每條記錄的備選要害字。在做完這些事之后,為每個表格分配主要害字就很輕易了。現在我為每個示例數據庫定義了下列表格(星號表示主要害字字段):
  
  Books: {*Title, *ISBN, Price, Publisher}
  Authors: {*FirstName, *LastName}
  Categories: {*Category, Description}
  
  要注重,Categories包含有一個新的字段——Description。單字段的表格是可以接受的,但是加入了描述文本的字段將有助于更加完全地解釋每個分類。
  
  
  --------------------------------------------------------------------------------
  
  將計數字段(counter field)作為主要害字
  大多數關系型數據庫治理系統(RDBMS)都會提供一類計數或者自動編號的數據類型,它會為每條記錄分配一個連續的數值。盡管這些計數字段會保證你得到一個備選要害字,但是這個要害字對于搜索是毫無疑義的。假如你把計數字段作為主要害字,你至少還需要另一個字段,這樣才能以有意義的方式找到記錄。
  
  
  --------------------------------------------------------------------------------
  
  
  那么Authors又會是什么樣的呢?在Authors表格里出現重復的姓和名的機會似乎不多,尤其當你的數據庫很小的時候。但是不管怎么說這不是不可能的。你可以為這個表格分配一個計數字段,這肯定會解決唯一性的問題,但是這不會有助于你區別不同的作者。
  
  在這里,解決我們問題最簡單的方法是加入某種聯系信息,例如電子郵件地址或者作者所居住的州或者地區等信息,但是這還是不夠明確。你有可能碰到住在同一個州同名同姓的兩個作者。這樣的情況不多但不是沒有可能,所以最好還是為出錯做好預備。你可以考慮加入每個作者的郵件地址,但是為了保持例子的簡單,我只加入了州名和郵政編碼,并擴展主要害字,讓其能夠同時包含兩個新的字段:
  
  Authors: {*FirstName, *LastName, *State, *ZIP}
  
  
  在這一點上,這真的是保證Authors表格唯一性的唯一方法。
  
  刪除重復值
  
  
  
  1NF需要我們滿足的最后一條要求是在數據里不能有重復的組(group)。在沒有檢查真實數據之前,要確定你是否滿足了這一要求是相當困難的,但是既然我們已經碰到了,不管怎么樣就應該著手解決。之后,假如看到一個值重復了多次,我就會考慮把這個字段移動到一個新的表格里。假如我數據庫里的表格通過別的途徑被正確地規范化了,那么重新建模將不會是個大問題。事實上,許多數據庫應用程序似乎總在不停地擴展
  
  這最后一條規則最明顯的違反者是Books表格里的Publisher(出版商)字段。盡管有很多出版商,但是我毫無疑問會發現自己一次又一次地碰到同一個出版商。為了讓Books滿足1NF,我必須要把這個字段移動到另一個表格里。現在示例數據庫看起來像下面這樣:
  
  Books: {*Title, *ISBN, Price}
  Authors: {*FirstName, *LastName, *State, *ZIP}
  Categories: {*Category, Description}
  Publishers: {*Publisher}
  
  你可能不會碰到重復的出版商名,但是為了安全起見,你可以決定將自動編號字段作為主要害字。假如這樣做的話,你的表格設計應該會像下面這樣:
  
  Publishers: {*PublisherID, Name}
  
  最后,示例數據庫里的表格看上去都符合1NF的要求了。每個字段都盡可能的小,沒有重復的組和多值字段,每個表格都有一個要害字。你可能會問還差什么?究竟,開始的時候只有一個表格,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黎川县| 保德县| 潞城市| 裕民县| 多伦县| 辉县市| 延安市| 灵山县| 浏阳市| 德州市| 兖州市| 曲水县| 镇原县| 莲花县| 阳原县| 巫溪县| 务川| 乡城县| 修水县| 文登市| 库尔勒市| 信阳市| 长宁区| 奈曼旗| 乐清市| 左权县| 台安县| 大宁县| 大厂| 潜山县| 钟山县| 米脂县| 天峨县| 佛山市| 湘潭县| 龙州县| 周宁县| 重庆市| 凌云县| 青铜峡市| 鄂托克旗|