2015-02-24 45 views
1

我有一個概念性問題。SQL表OR域

我的數據庫有一張表,用於存儲有關人員的信息。其中一個字段是他們的電話號碼(我的國家是8位數字)。

事情是,在某些情況下,兩個或更多的人將有相同的電話號碼。

我的問題是:將電話號碼存儲在另一張桌子上,然後通過外鍵引用它,而不是將它們存儲爲字段,會是更好的選擇嗎?如果是這樣,結果對於任何數據庫的大小是?

我不知道這是否會產生任何影響,但表格將不會超過600.000 - 800.000條記錄,我猜這些重合的電話號碼將佔記錄總數的10%左右。

編輯:

- 每個記錄最多可以有4個電話號碼(兩條線和兩個單元)

導向軸的情況下會發生,會有有時當用戶將尋找所有具有特定號碼的人,以及用戶想知道什麼是一個人的所有電話號碼的時間

+0

如果每個用戶只有一個電話號碼,則可以保持原樣。 – Alex 2015-02-24 21:05:11

+0

對不起,我沒有這樣說,我編輯了這個問題。每個人最多可以有4個號碼 – 2015-02-24 21:09:06

+1

我會問這個問題。如果一個用戶的號碼發生變化,這是否意味着號碼相同的所有用戶都會改變?如果是這樣,我會使用一個單獨的表格。否則,這似乎沒有多大意義。 – dan08 2015-02-24 21:09:13

回答

1

從技術上來說,你需要一個單獨的電話號碼錶,然後是一個PersonPhonenumber表。

但是,實際上我很少看到這個電話號碼和地址的結構。首先,當你只是想改變一個人時,很容易犯一個錯誤,更新一個人以上的地址或電話。對於另一個它增加了一個額外的連接,似乎並不需要大多數人。除了少量的重複之外,你並沒有真正獲得這個水平。

真正的決定因素是你如何使用和更新數字。如果要頻繁更新所有具有相同號碼的人員,最好完全標準化。如果您通常只需要一次更新一個人,那麼只有一個人員表格和一個人員電話號碼錶格可能風險較小。

如果你想要歷史記錄,那麼我會去一個人表和aPersonPhoneNumber歷史表。它將具有personid,電話號碼,開始日期和結束日期。所以當約翰和瑪麗離婚時,他的電話號碼會有一個結束日期,但是她的電話號碼不是,你可以清楚地看到誰有電話號碼。

+0

我明白了你的觀點,這正是我的問題所在。但是,關於性能。你會建議創建兩個表格(PhoneNumbers和ContactHistory),或者只有一個表格並存儲它嗎?我只是擔心接觸歷史的問題,我們會談論每天增加約2000條記錄。給我建議,我很樂意接受你的回答。 – 2015-02-24 21:37:45

+0

有很好的索引,性能可能會好,但我不是mysql專家,因爲我更熟悉SQL Server。如果您選擇將歷史記錄與當前電話號碼分開,請確保從觸發器填充歷史記錄表以確保記錄所有更改。 。 – HLGEM 2015-02-24 21:53:36

0

通常電話號碼只是一個數字,並且沒有人沒有任何意義。 所以你把它存儲在Person表中。

但是,您爲電話公司工作的電話號碼具有不同的含義和用途(如歷史記錄,電話查詢,計費),則應將其存儲在單獨的表格中。我希望它有幫助。

+1

切勿將分隔符用於多個數字。如果你每個人有多個電話號碼,那麼應該是一個相關的表格。我同意你所說的其餘部分,但存儲逗號分隔列表是一個sql防範。 – HLGEM 2015-02-24 21:13:46

+0

它的確有幫助,它不是電話公司,但手機確實會用於其他一些原因(電話lokup和歷史將是最常見的)。將他們separating提高性能顯着? – 2015-02-24 21:14:03

+1

我同意分隔符是一個壞主意。對於電話查詢,您可以在電話號碼列上進行索引。對於歷史它不起作用。 – MaxZoom 2015-02-24 21:21:00

1

如果每個人更多的則1個電話號碼

有一個很好的理由來設置新的表所示: id, user_id, phone, type, description

所以type可能是 家庭,工作,Office2,老闆名單,妻子,傳真,手機等...

description「工作時間只」, 「黃昏」, 「全天候」,「緊急ONL y「等

如果您真的爲您的應用程序管理電話簿,將電話號碼與原始用戶表分開是個好主意。

0

如果您有兩個擁有相同電話號碼的人,則在搜索特定電話號碼時會遇到問題。搜索特定的電話號碼有時會返回多個結果(根據您的估算,爲10%)。如果您通過電話號碼和人進行搜索,則可以要求所有電話號碼搜索都包含用戶標識符(名,姓,地址等)。這取決於你的目標是什麼。

+0

這兩種情況都會發生,有時候用戶會在哪裏查找所有具有特定號碼的人,以及用戶想要知道一個人擁有的電話號碼是什麼的時間 – 2015-02-24 21:20:49