2009-07-14 73 views
77

我在我的MySQL數據庫中存儲各種用戶詳細信息。最初它被設置在各種表格中,意味着數據與UserIds鏈接,並通過有時複雜的調用輸出,以根據需要顯示和操作數據。建立一個新的系統,將所有這些表合併成一個相關內容的大表格幾乎是有道理的。哪種更高效:多個MySQL表或一個大表?

  • 這會是一個幫助還是障礙?
  • 調用,更新或搜索/操作時的速度考慮因素?

下面是我的一些表結構(S)的例子:

  • 用戶 - 用戶ID,用戶名,電子郵件,加密的密碼,註冊日期,IP
  • user_details - Cookie數據,姓名,地址,聯繫方式,工作單位,人口統計數據
  • user_activity - 捐款,最後在網上,最後一次觀看
  • user_settings - 個人資料顯示設置
  • user_interests - 廣告定位的變量
  • user_levels - 訪問權限
  • user_stats - 命中,吻合

編輯:我upvoted所有的答案到目前爲止,它們都具有的元素,基本上回答我的問題。

大部分表格都有1:1的關係,這是造成非規格化的主要原因。

如果表格跨越100列以上時會出現問題,當這些單元的大部分可能保持空時?

+0

This [other question](http://stackoverflow.com/questions/8685621/what-is-the-best-database-schema-to-support-values-that-are-only-appropriate-to/9460541 #9460541)也可能有所幫助 – 2013-10-13 05:37:51

回答

47

多個表幫助在以下方面/情況:

(a)如果不同的人將要涉及到不同的表開發應用程序,是有意義的分割。 (b)如果您希望爲不同的人提供不同的權限以用於數據收集的不同部分,那麼將它們拆分可能會更方便。 (當然,您可以查看定義的視圖並適當授予它們)。 (c)爲了將數據移動到不同的地方,尤其是在開發過程中,使用導致較小文件大小的表格可能是有意義的。 (d)較小的足跡可能會讓您感到舒適,同時您開發的應用程序只針對單個實體的特定數據收集。 (e)這是一種可能性:您認爲單一價值數據在將來可能變成真正的多重價值。例如信用額度是目前的單一價值領域。但是明天,您可能會決定將這些值更改爲(從日期到日期,信用值)。拆分表格現在可能會派上用場。

我的投票將用於多個表 - 數據適當地分割。

祝你好運。

+1

有多個表會有任何性能下降? – 2016-09-01 03:33:34

29

組合這些表稱爲反規範化。

它可能(或可能不會)幫助做出一些查詢(使大量JOIN s)以創建維護地獄爲代價運行得更快。

MySQL只能使用JOIN方法,即NESTED LOOPS

這意味着對於驅動表中的每個記錄,MySQL在循環中定位驅動表中的匹配記錄。

查找記錄是相當昂貴的操作,可能需要數十倍的純記錄掃描時間。

將所有記錄移動到一個表中將幫助您擺脫此操作,但表本身變得更大,並且表掃描需要更長的時間。

如果您在其他表格中有很多記錄,那麼增加表掃描可能會超出正在順序掃描的記錄的好處。

保證地獄,另一方面,是有保證的。

+0

如果您有10000個用戶,並且您正在使用正確設置外鍵的數據庫進行連接,那麼您應該只需要通過執行類似select * from *的強大查找,其中name =「bob」 。一旦你有了bob,那麼你正在使用一個索引來查找連接的表來bob,因爲你使用了bob的id,所以它顯着更快。無論您是在查詢中查詢還是查詢bob,然後單獨查詢表,都會發生這種情況。當然希望你的第二個查詢是基於bob的id而不是別的。 – 2016-09-12 16:37:16

6

創建一個大型表違背了關係數據庫的原則。我不會把他們全部合併成一張桌子。你將獲得重複數據的多個實例。例如,如果您的用戶有三個興趣愛好者,那麼您將擁有3行,並使用相同的用戶數據來存儲三種不同的興趣愛好。 Definatly去多個'規範化'的表格方法。請參閱this維基頁面以進行數據庫規範化。

編輯: 我已經更新我的答案,因爲你已經更新了你的問題。我現在更因爲我最初的回答同意...

這些細胞中的大部分是 可能保持空

如果例如,用戶沒有任何的興趣,如果你正常化,那麼你簡單的不會有在該用戶的興趣表中的一行。如果你擁有一個巨大的表格中的所有東西,那麼你將會得到僅包含NULL的列(顯然它們中的很多)。

我曾經在一家電話公司工作,那裏有大量的表,獲取數據可能需要很多連接。當從這些表中讀取數據的表現非常關鍵時,那麼創建的程序可能會生成一個不需要連接,計算等報表指向的平坦表格(即非規格化表格)。這些地方隨後與SQL服務器代理一起使用,以某些時間間隔運行作業(即每週查看某些統計信息將每週運行一次等等)。

2

我認爲這是「這取決於」的情況之一。擁有多個表格更清潔,理論上可能更好。但是,如果您必須加入6-7個表才能獲取有關單個用戶的信息,則可能會開始重新考慮這種方法。

8

是否全部那些表有1-to-1的關係?例如,每個用戶行在user_statsuser_levels中只有一個對應的行嗎?如果是這樣,將它們合併成一個表格可能是有意義的。如果關係不是1 to 1雖然,它可能沒有意義合併(非規範化)他們。

將它們放在單獨的表格中與一張表格相比,可能對性能影響不大,但除非您擁有數十萬或數百萬的用戶記錄。你會得到的唯一真正的好處是通過結合它們來簡化你的查詢。

ETA:

如果您關注是關於有太多的列,後來想想什麼東西,你通常使用起來並結合這些,留下其餘的在一個單獨的表(或幾個獨立表如果需要)。

如果你看看你使用數據的方式,我猜你會發現80%的查詢使用了20%的數據,其餘80%的數據只是偶爾使用。將經常使用的20%組合到一張表中,並將不經常使用的80%留在單獨的表中,這樣可能會有很好的折衷。

+0

是的,每個用戶只有一行,每個用戶只有一行,只是爲了節省管理大量重複數據的頭痛。這就是爲什麼我認爲一桌適合。如果用戶數據跨越多行,我希望將這些表與主用戶表分開。 – 2009-07-14 12:28:19

+1

如果每個表格都有1對1的關係,那麼一張表格會更容易使用。在這種情況下,不需要拆分表格。 將表拆分爲超過1行,這可能導致另一個開發人員以這種方式對待它們的情況。 – 2009-07-14 12:34:44

1

我想說這取決於其他表的真正含義。 user_details是否包含多個/多個用戶等等。 標準化的哪個級別最適合您的需求取決於您的需求。

如果您有一張表格的索引良好,可能會更快。但另一方面可能更難以維護。

對我來說,它看起來像你可以跳過User_Details,因爲它可能與用戶有1對1的關係。 但其餘的可能是每個用戶的很多行?

16

他們都是1:1關係嗎?我的意思是,如果用戶可能屬於不同的用戶級別,或者用戶興趣表示爲用戶興趣表中的多個記錄,那麼合併這些表就不會立即產生問題。

關於以前關於規範化的回答,必須說數據庫規範化規則已經完全忽略了性能,並且只考慮了什麼是整潔的數據庫設計。這通常是你想要達到的目標,但是有些時候,爲了追求績效而主動去規範化是有意義的。

總而言之,我想說問題歸結爲表格中有多少個字段,以及它們被訪問的頻率。如果用戶活動通常不是很有趣,那麼總是將它放在同一個記錄上,對於性能維護原因可能只是令人討厭。如果某些數據(如設置)經常訪問,但只包含太多字段,則合併這些表可能不太方便。如果您只對性能增益感興趣,可以考慮其他方法,例如保持獨立設置,但將它們保存在自己的會話變量中,這樣就不必經常爲它們查詢數據庫。

+0

我不得不完全不同意你的評論,即標準化只注重整潔並完全無視表現。在這兩種情況下都存在折衷,非規範化實際上使數據完整性處於風險之中。我會說數據庫的規範化實際上提高了數據庫的總體性能,而不是從非規範化表中快速忽略性能提升。 – 2016-09-12 16:32:57

6

爲什麼不使用Wordpress通過擁有每個人都擁有基本用戶信息的用戶表,然後添加一個「user_meta」表,該表基本上可以是與用戶標識關聯的任何鍵值對。因此,如果您需要爲用戶查找所有元信息,您可以將其添加到您的查詢中。如果不需要登錄之類的東西,你也不需要添加額外的查詢。這種方法的好處還可以讓您的桌面向您的用戶添加新功能,例如存儲他們的Twitter處理或每個個人興趣。您也不必處理相關ID的迷宮,因爲您擁有一張統治所有元數據的表格,並且您將其限制爲只有一個關聯而不是50個。

Wordpress專門爲此設置了功能通過插件添加,因此可以讓您的項目更具可擴展性,並且如果您需要添加新功能,則不需要完整的數據庫檢修。

相關問題