2012-04-27 27 views
3

我設計了我的數據庫,使得我的一個表包含52列。所有的屬性都與主鍵屬性緊密相關,所以沒有進一步規範化的範圍。在SQL表中有超過50列

如果出現同樣的情況,並且您不希望在單個表格中保留如此多的列,請讓我知道,還有其他選項可以做到這一點。

+0

這不是一個好的設計,afaik,例如,想到插入查詢,你將不得不放置50個值,而這顯然不是一個好的體驗 – Satya 2012-04-27 06:31:45

+1

,如果它們是主鍵的屬性,那確實沒關係。我有超過250列的表格。可以完全正常。 – 2012-04-27 06:41:55

+0

50列可以。如果它們是表格描述的實體的屬性,那麼它就是第三種常規形式,那麼,好吧,隨它去吧。如果存在重複字段或其他規範化規則違規,則需要完成更多工作。 – 2012-04-27 11:30:37

回答

0

具有52列的表格不一定是錯的。正如其他人指出的,許多數據庫都有這樣的野獸。然而,我不認爲ERP系統是良好數據設計的範例:根據我的經驗,它們傾向於相反。

無論如何,繼續前進!

你這樣說:

這意味着你的表是第三範式(或者BCNF)「所有的屬性都緊密地與主鍵 屬性相關聯」。情況就是這樣,不可能進一步正常化。也許你可以去第五範式?

第五範式是關於刪除連接依賴關係。所有列都依賴於主鍵,但列之間也可能存在依賴關係:例如,COL42的每個值都有多個COL42值。加入依賴意味着當我們添加一個新的COL23值時,我們最終插入幾條記錄,每條記錄對應COL42的每個值。 Wikipedia article on 5NF有一個很好的例子。

我承認沒有多少人去5NF。很可能,即使你的桌子有五十二個柱子已經在5NF。但值得檢查。因爲如果你可以分解一個或兩個輔助表格,你將會改進你的數據模型,並使你的主表更易於使用。

2

我們曾經使用過的一種方法是將表格分成兩個表格。這兩個表都獲得原始表的主鍵。在第一個表格中,您放置了最常用的列,在第二個表格中放置了較少使用的列。通常第一個應該更小。你現在可以用各種指數加速第一個表格中的內容。在我們的設計中,我們甚至有第一個表在內存引擎(RAM)上運行,因爲我們只有讀取查詢。如果您需要從table1和table2中獲得列的組合,則需要使用主鍵連接兩個表。

+0

有趣的方法,不適合每個人,但值得注意。 – Ollie 2012-04-27 08:25:35

3

以任何方式有50列並不奇怪。 ERP系統在某些表格中通常有100多列。

你可以研究的一件事是確保大多數列獲得有效的默認值(null,今天等)。這將簡化插入。

還要確保你的代碼總是指定列(即沒有「select *」)。任何未來的優化都將包括索引與列的一個子集。

-1

另一種選擇是「多列表」MCT設計中的「項目 - 結果對」(IRP)設計,特別是如果您不時添加更多列。

MCT_TABLE 
--------- 
KEY_col(s) 
Col1 
Col2 
Col3 
... 


IRP_TABLE 
--------- 
KEY_col(s) 
ITEM 
VALUE 


select * from IRP_TABLE; 


KEY_COL ITEM VALUE 
------- ---- ----- 
1  NAME Joe 
1  AGE 44 
1  WGT 202 
... 

IRP有點難以使用,但更靈活。

我已經構建了使用IRP設計的非常大的系統,即使對於海量數據它也可以很好地運行。事實上,當你只需要幾列(即更多I/O)時,它只能像你所需要的行(即較少的I/O)而不是整行那樣行,就像列組織DB一樣。