2012-04-27 98 views
0

自從我開始處理我的數據庫以來,我一直在爲最初的決定而奮鬥。我在辯論我是否需要爲電子郵件地址設置單獨的表格。我的數據庫看起來是這樣的:名稱和電子郵件地址的單獨表格?

people(id, first_name, last_name, email) 
addresses(id, address, street, city, state, zip, latitude, longitude) 
addresses_people(id, person_id, address_id) 
phone_numbers(id, person_id, phone_number, type) 

我想我並不需要一個單獨的表的電子郵件地址,我只是想每人一個,無論他們是否有更多的。我似乎有的問題是,有些人不會有電子郵件地址。我經常會將孩子存放在人們的桌子上。現在看來,如果我將電子郵件地址放在單獨的表格中,以避免成千上萬個空電子郵件字段,這將會是更好的設計。

現在應用程序已經投入生產,現在改變它是一個巨大的麻煩,但現在改變它,而不是從現在開始的一兩年,將會成倍地變得更加容易。將電子郵件更改爲另一張表是否值得一兩天?

+0

然後,您將用數千個空的文本字段替換數千個空的外鍵字段。 – 2012-04-27 15:30:43

+0

什麼比例的領域將是空的? – stuartd 2012-04-27 15:31:06

+0

@ Mr.Disappointment:外鍵可能在'emails'表格一側。 – 2012-04-27 15:32:52

回答

3

在我看來,你是過度工程。可選email字段沒問題。實際上,單獨的表格可能會帶來更大的開銷。

如果您希望用戶擁有多個電子郵件,則單獨表的唯一原因是建模1-N關係。

+0

感謝您的快速回答!我喜歡那個答案:)爲我節省了很多時間。只是一些跟進問題。我的address_people表呢?我最近意識到,不止一個人可以擁有相同的地址。例如,我想存儲爲兩個不同人的孩子的母親和父親,但他們的地址相同。有鏈接表addresses_people是一個更好的方式,然後有兩個不同的人有相同的地址?但這種情況不會經常發生。大多數情況下,我會保存一個父母,但我想要兩個選項。 – 2012-04-27 15:40:41

+1

@Brian:實際上,如果一個人只能住在一個地方,我只需在'people'表中尋找'address_id'外鍵 - 不需要'addresses_people'連接表。除了很多時候,地址只是人員記錄的一部分 - 但卻是一種非規範化的形式。 – 2012-04-27 15:51:22

+0

這似乎很明顯:)我不知道爲什麼我會這樣想! – 2012-04-27 15:54:43

1

我相信沒有必要改變它。大多數情況下,連續排列一些字段並不是什麼大問題。事實上,它在大多數數據庫中都很常見。除非存在嚴重的存儲限制或其他情有可原的情況,否則數據庫的設計應取決於您試圖建模的對象,而不是僅僅爲了存儲原因將事物分解爲表格。

請參閱Database design - empty fields這也爲您的問題提供了很多信息。

相關問題