2016-08-23 49 views
0

對於使用MySQL一個項目,我有一個分貝,看起來像這樣:數據庫設計:冗餘列VS未使用的列

表#1:列A,列B,列C,列D

表#2:列A,列B,列E,柱F.

正如你可以看到列A和B是冗餘通過表(相同類型,相同類型的信息爲每個表) 。

有人建議我一個桌子底下重組一切:

表#1:列A,列B,列C,柱d,E欄,F欄

的問題是我的一些項目使用列C和D和其他一些使用E和F,因此對於某些行,這些列將始終爲NULL

這裏推薦的做法是什麼?是否有標準設計要遵循?性能和資源(數千行和~10個表)如何?

一種情況有冗餘列,另一種情況有未使用列。

或者,也許我可能分裂表,並創建一個關係,所以它給像:

表1:列A,B列

表#2:列A (外鍵),柱C,列D

表#3:列A(外鍵),E欄,F欄

我有點不知所措。這對我來說是新的。感謝您的任何意見。

+3

沒有標準。只有對你有用的東西。 –

+3

您應該使用最適合您業務需求的設計。由於我們不符合這些要求,因此爲您推薦解決方案相當困難。 – Shadow

+0

爲什麼你只需要C,D和Type來表示它是CD還是EF類型的記錄呢?空位消失了,你有4列1桌。 (假設記錄不能是CD和EF)但是 – xQbert

回答

3

如果這些都是1-1關係,我會將它們粘貼到一張表中以便於使用。沒有真正的理由,你不能在表中存儲NULLS。就我個人而言,我寧願處理這些,而不必處理保持兩個表格之間的鍵同步。

我可以看到保持它們分開的唯一主要好處是,如果要控制給定用戶訪問的信息級別,可以在不同的表上放置不同的權限。例如,表A包含主要人員記錄,表B包含聯繫人信息。當然,您的標準用戶帳戶可以訪問該帳戶,但您可能不希望每個用戶都有權訪問包含用戶SSN的表C.

如果這些是1-n關係,那麼你說的是完全不同的東西,而且將它分成多個表格顯然更好。

+0

爲什麼downvote? – Jacobm001

+0

我已經添加了upvote來平衡它...我沒有看到你說的話有什麼問題。 –

+0

@GrahamNicol不要這樣做。投票內容,而不是投票。如果您認爲該帖子值得讚揚,請相應投票。如果你認爲它不值得讚揚,那不合你的意願。 –

0

這取決於您的查詢/寫入行爲。如果你像你說的那樣測量成千上萬的行,那麼這兩種方法都不會有很大的差別。

也許最好是圍繞更直觀的方案來規劃一個模式。從這個角度來看,我更喜歡在兩個表中看到多餘的數據,以便在一個表中查看整個地方的空值。

0

這裏不完全有用的答案是「它取決於」。你應該考慮超出表格所保留的範圍,並考慮表格的用途。

如果您要從表1和表2中檢索數據並將其存儲在單個空間中,並且where子句將反映A列和B列的值,那麼將所有數據都放在一個表中最有意義。

如果你只是一次只查詢一張表,那麼單獨使用一張表並不會有太大的好處,因爲那時你會「試圖讓一件事成爲兩件事」。

如果表1和表2之間「通用」的列數將超過2,那麼拆分表並在子表中保留「特定於領域」的知識是一個很好的解決方案(查看「Party」數據模型對於CRM世界中的一些例子)。

大多數數據庫會壓縮空列,所以現在沒有任何物理上的理由來選擇一個。