2011-01-08 82 views
1

我確實有一個包含多個表的數據庫。多表會降低結果的速度嗎?

這種多表是關係到例如單個名稱..

Table 1 contains name of the person, joined date,position,salary..etc 

Table2 contains name of the person,current projects,finished,assigned...etc 

Table 3 contains name of the person,time sheets,in,out,etc... 

Table 4 contains name of the person,personal details,skill set,previous experiance,...etc 

所有表中包含人數超過50000 names,及其詳細信息。

所以我的問題是所有的表格都包含了一個名字相關的信息說Jose20856這個名字是所有4個表格的唯一索引。當我搜索Jose20856時,所有四個表都會給出結果並輸出到前端軟件/ html。 所以我需要保持多個表或組合到一張表?

如果是這樣

CASE 1 
Single table -> what are the advantages? will result will be faster? what about the system resource usage? 

CASE 2 
Multiple table ->what are the advantages? will result will be faster? what about the system resource usage? 

由於我是新來的MySQL我想有您的寶貴意見向前邁進

回答

1

閱讀有關數據庫標準化的網絡上。

E.g. http://en.wikipedia.org/wiki/Database_normalization

我想你甚至可以添加更多的表。這完全取決於數據和關係。

Table1 = users incl. userdata 
Table2 = Projects (if multiple users work on the same project) 
Table3 = Linking user to projects (if multiple users work on the same project) 
Table4 = Time spent? Contains the links to the user and to the project. 

我認爲你的表4可以合併到表1中,因爲它也包含特定於1個用戶的數據。

你可以做更多的事情,但如前所述,這一切都取決於和關係。

+0

但會在這裏?適用因爲所有四個表的索引相同的名稱沒有一點區別? – 2011-01-08 17:08:25

1

你可以將這些組合成一張表,但前提是它有意義。很難說您的表格中的關係是一對一還是一對多,但似乎是一對多的關係。例如表1中的一名員工應該能夠在其他表中有多個項目,技能和時間表。這些都是一對多的關係。

因此,保持多表設計。您還應該考慮爲員工使用基於整數的主鍵而不是名稱。使用這個pkey作爲其他表中的fkey,你會看到性能的提高。 (還要考慮如果你想改變名字時你需要做的工作量,你必須改變所有表中的所有名字,如果你使用代理鍵,int pkey,如上所述,你只能必須更新一行。)

1

我們在這裏討論的是垂直table partitioning(而不是水平表分區)。這是一個有效的數據庫設計模式,在以下情況下可能會有用:

  1. 有太多列可放入一個表中。這很明顯。
  2. 有些列比較頻繁地訪問,有些則訪問比較少。例如,如果您經常需要很少顯示列joined date,position,salary和列personal details,skill set,previous experiance,那麼移動這些列來分隔表是有意義的,因爲它可能(可能)會提高訪問最常用的表的性能。在MySQL中,這對於TEXT和BLOB列尤其如此,因爲它們與其餘文件分開存儲,因此訪問它們需要更多時間。
  3. 有NULLable列,其中大多數行是NULL。再一次,如果它大部分爲空,將它移動到一個單獨的表格將允許您減小「mani」表的大小並提高性能。新表不應該允許空值,並且只有設置了值的行纔有條目。這樣你也可以減少存儲/內存資源的數量。
  4. 特定於MySQL - 您可能希望tom將您的某些列從nnoDB表移動到MyISAM,以便您可以使用全文索引,同時仍然可以使用InnoDB提供的一些功能。儘管這不是一個好的設計 - 最好使用像Sphinx這樣的全文搜索引擎。

最後但並非最不重要。我建議使用數字字段作爲連接所有這些表的鍵,而不是字符串。


Additional reading aboout MySQL partitioning(有點過時,從MySQL 5.5增加了一些新功能)