Normalization

具有不同郵件列表的地址簿的數據庫架構

  • June 8, 2012

我正在幫助一位朋友使用一個舊的 excel 單頁數據庫,其中包含大約 12 個不同的列,這些列儲存以下資訊:

  • 人名+姓
  • 電子郵件
  • 目前的地址
  • 電話
  • 排序程式碼
  • 接收郵件列表
  • 有關他們的教堂和第一個 cursillo 參加的其他資訊

我開始將其規範化為不同的表格。

person | address | email | phone | mailing | church | cursillo

我確定我可能還可以獲得更多表格,目前數據庫有很多缺失的數據,並且某些欄位包含多個電子郵件帳戶或多個電話號碼。

我的朋友沒有時間學習不同的數據庫或學習程式,所以我想讓他的一切都盡可能簡單。對於新網站,我們正在考慮在 WordPress 中進行設置;上一個是他在 iWeb 中建構的。

理想情況下,我們希望能夠輕鬆提取不同的郵件列表,例如:

Send e-mail to everyone who attended cursillo 50  
 OR  
Send e-mail to everyone who wants the monthly mail (mailing is just yes/no field option linked to person id)  
 OR  
Send e-mail to the new cursillo team for the upcoming weekend  
 OR  
Send e-mail to people who attend a specific church  

等等。

但是,在拆分錶格後,我發現我不確定維護起來有多容易。如果我的朋友想要更改 John Smiths 的電話號碼,他必須進入person表格並找到idforJohn Smith然後進入phone表格更改號碼。

我應該怎麼做才能最大限度地減少維護這樣一個數據庫所需的工作量?如,我真的應該將數據庫規範化為 3NF/BCNF 嗎?

我會將數據留在一個表中。實際上,數據現在已經標準化,因為您有一個 Person 表。該人由名稱標識,其餘列是有關該人的數據。每列取決於名稱,並隨名稱而變化,這意味著它已經在 3NF 中。如果你正在建構一個大型應用程序,比如一個公司應用程序,那麼為電子郵件、電話、地址等創建表可能是有意義的。但由於這只是一個簡單的郵件列表,我會保留一個表。我不認為你有一個用於地址或教堂的表格的價值,例如,當這些都對你沒有意義時,除了它們與目前的人有關。

現在,如果你確實有很多關於那個地址或那個教堂的數據,例如,那麼這些“實體”需要變成表格來儲存關於每個地址或教堂的數據。假設您的郵件列表包含教堂名稱、教堂地址、牧師和平均出席人數。現在你有理由創建一張教堂餐桌了。您的列 - 地址、牧師、平均出席人數 - 僅取決於教堂名稱,而不是人名。但是,如果您只有教堂名稱,那麼在這種情況下創建一個只有 id 和名稱的教堂表確實沒有任何好處。

您可以規範化的一個領域是將重複組(電子郵件和電話)刪除到子表中。但是您也可以創建多個列 - 每個列 3 個 - 我相信這對於這個應用程序來說已經足夠了。雖然沒有標準化,但這樣做的唯一缺點是如果您需要儲存 4(不太可能,這只是一個郵件列表),那麼您就不走運了。它還使查詢更加複雜,因為如果要返回所有電話號碼,則必須選擇每一列而不是加入子電子郵件表。

底線是規範化是關於消除冗餘。聽起來您在郵件列表中的冗餘很少,並且將目前郵件列表中的各個列分解為它們自己的表,如果除了 id 和 name 之外沒有這些表的列,那將是矯枉過正。

引用自:https://dba.stackexchange.com/questions/18771