實踐數據庫規範化
我是數據庫設計的新手,我對如何創建具有最小冗餘的數據庫有點困惑。假設我有一個
abc
包含重複數據的表,並且沒有兩行是相同的。現在減少重複?我遵循規範化規則並將表格分解為與 tableabc
有關係的其他表格abc
。現在在表中顯式添加一個主鍵來abc
唯一標識每一行是公平的做法,還是我們可以忽略添加主鍵?如果在表中添加主鍵
abc
並且表中abc
包含一列authid (int)
。然後它與其中的主鍵值發生衝突。更新
要詳細說明一個平面數據庫,
abc
假設我有一個library table
帶有列的ISBN Title Auid Auname Auphone Pubid Pubname pubphone price ----------------------------------------------------------------------------- 11111 C++ 4 Roman 2147483647 1 Big House 1234567890 20 9999 Emma 1 Austen 1111111111 1 Big House 1234567890 20 9133 Faeri 7 Spenser 2147483647 1 Big House 1234567890 15 9104 Hamlet 5 Shakespeare 2147483647 2 Alpha Press 2147483647 20 1034 Iliad 3 Homer 2147483647 1 Big House 1234567890 25 1234 Jane 1 Austen 1111111111 3 Small House 2147483647 49 9977 King 5 Shakespeare 2147483647 2 Alpha press 2147483647 49 5555 Macbeth 5 Shakespeare 2147483647 2 Alpha press 2147483647 12
在這裡,
lib table
我們可能有ISBN
兩行相同,但任何兩行都是唯一的。數據的重複很明顯,如圖所示,為了減少這種情況,我們可以打破表格並遵循規範化圖書
Title ISBN Price ISBN primary key
作者
AuName AuPhone AuID Auid primary key
出版商
PubName PubPhone PubID Pubid primary
和:
書籍/作者
ISBN Auid
維護書籍/作者關係
那麼我可以在平面中明確添加主鍵
library table
還是如何實現規範化?我想我應該添加主鍵否則沒有關係。這是否足以實現規範化或任何其他概念或審查總是受歡迎的?以下範例來自Steven Roman 的 Access Database Design & Programming, 3rd Edition
你對桌子的拆解在很大程度上是正確的。存在三個有形物體,一本書、作者和出版商。這些中的每一個都需要一個表,我們還需要一個表來儲存 Authors 和 Books 以及 Publishers 和 Books 之間的關係,因為這些關係是多對多的。
圖書
ISBN (primary key) Title Price
作者
AuId (primary key) AuName AuPhone
出版商
PubId (primary key) PubName PubPhone
書籍作者
AuBId (primary key) AuId (composite key) ISBN (composite key)
圖書出版商
PubBId (primary key) PubId (composite key) ISBN (composite key)
您可以只使用複合鍵,而不是在定義多對多關係的最後兩個表上使用顯式主鍵。
編輯:
當我說複合鍵時,我的意思是如果主鍵存在,它是由多列組成的備用唯一鍵。如果沒有定義其他主鍵,則主鍵將被定義為兩列,即
PubId
和ISBN
。使用複合鍵作為主鍵有利有弊,人們對最佳選擇有不同的看法。沒有理由用上面的表結構顯式儲存庫表,所有資訊都已儲存。如果絕對必要,我會認為 ISBN 是唯一的,如果不是,您可以如上所述添加一個主鍵列,如 serialno 以保持完整性。