2017-05-26 52 views
0

我有一個包含聯繫人的數據庫。有兩種不同類型的聯繫人,供應商和客戶。MySQL:最好有兩個表格或兩列

供應商表具有通過外鍵值附加的vendor_contacts表,以允許一對多關係。客戶端有一個類似的表格。

這些聯繫人可以與電話號碼錶有一個或多個關係。我是否應該爲每個電話號碼錶分配一個電話號碼錶,還是使用兩個外部電話號碼共享一個電話號碼錶,以允許其中一個爲空?

OPTION 1

enter image description here

在這裏,我將不得不強制執行VENDOR_ID或CLIENT_ID之一是NULL,而另一個不是NULL在共享電話表中。

OPTION 2

enter image description here

這裏每個表都擁有自己的電話號碼錶。

+0

我不確定我是否理解這個問題 - 您能否發佈當前模式,以及您正在考慮的兩個選項? –

+0

「供應商**表**有一個vendor_contacts **表**」我假設其中一個「表」是一個錯字。你桌子裏沒有桌子,是嗎? – SiggiSv

+0

@NevilleK編輯我的問題。希望這更容易理解。 :) – B3Caballero

回答

3

「浪費空間」在現代數據庫系統中並不是一個真正意義上的問題 - 通常存儲引擎會優化「空」值以無論如何都不佔用空間。相反,我認爲你需要看看可能的查詢場景,可維護性和模式的可理解性。

因此,一般情況下,重複自身的模式(許多具有相似列的表)表明可維護性差,並且通常會導致複雜的查詢。

在你的例子中,設想一個查詢來找出誰是一個給定號碼的呼叫者,他們可能試圖聯繫誰。

在選項1中,您查詢電話號碼,並將外部聯接到兩個聯繫人表 - 相對容易。在選項2中,你有兩個類似查詢的聯合(只有表名會改變) - 重複和很多機會出現錯誤。假設你想把電話號碼分成國家,地區和電話號碼 - 在選項2中,你必須這樣做兩次(並且修改所有查詢兩次)。在選項1中,你只需要做一次。

一般而言,重複是不良軟件設計的標誌;這也算數據庫模式。

這也是一個原因(正如@siggisv和@NigelRen所建議的那樣)將vendor_contact和client_contact表拼合成一個帶有「contact_type」列的單個表。

3

我會使用兩個不同的表,一個vendor_contacts表和一個client_contacts表。 如果你只有一張桌子,你總是浪費空間,因爲你將在每一行中有一個空列

3

TBH我會合並供應商和客戶表,並有一個'聯繫'表。這可能有一個聯繫人類型,並允許添加更新的聯繫人。 考慮你想添加一些東西給你的聯繫人 - 地址,你可能不得不以同樣的方式改變每張桌子,然後你想要生日(好吧,也許不是,但只是一個例子),並再次改變多個表格。而如果你有一個表,它可以減少管理這個的開銷。 這也意味着你有一個聯繫電話號碼錶!

2

選項2

但改變vendor_contact和client_contact到「聯繫人」

,並添加一個「類型」一欄爲「接觸」是確定的「客戶」或「供應商」,如果你需要單獨記錄。

+0

我也在想這個,但是另外一個答案提到會有浪費空間的空條目,從長遠來看這不會有害嗎? – B3Caballero

+0

這裏應該沒有空條目..每個客戶端一個行,每個供應商一個 - 並且只有你的電話號碼只有.. – Randy

+0

但是手機中的每個條目都有vendor_id = Null或client_id = Null – B3Caballero

2

我會盡其他人建議併合並vendor_contactclient_contact到一個contact表。

但最重要的是,我懷疑contact<->phone是一對多的關係。如果你考慮這個例子中,你會發現這是一個許多一對多關係。

「喬和瑪麗是兩個供應商,在同一個辦公室工作因此它們都具有相同的固定電話號碼,他們也有每個人都有自己的手機號碼。「

所以,在我看來,你將需要添加一個contact_number表的外鍵的兩列,contact_idphone_id

+2

僅僅因爲兩個人可能使用相同的數字而導致多對多的開銷並不值得。然後,當你移除一方來查看它是否是最後一個參考時,你必須制定出解決方案 - 爲什麼還要多加一些記錄呢? –