2010-02-16 69 views
13

我正在使用Ruby on Rails,但我認爲這個問題比這更廣泛,並且一般適用於數據庫設計。何時將模型分成多個數據庫表?

何時將單個模型拆分爲多個表是一個好主意?例如,假設我有一個用戶模型,並且模型中的字段數量真的開始累加。例如,用戶可以輸入他的網站,他的生日,他的時區,他的等等等等。

是否有任何優勢或缺點分裂模型,使用戶表可能只有基本信息,如登錄和電子郵件,然後有另一個表,每個用戶有這樣的UserInfo,另一個是UserPermissions,另一個是UserPrivacySettings或類似的東西?

編輯:爲了增加額外的光澤,大多數字段很少被訪問,除了特定於他們的頁面。例如,如果有人點擊到用戶的個人資料,只能訪問像生日那樣的東西。此外,一些領域(很少被訪問)有可能非常大。大部分字段都有可能被設置爲空白或零。

+0

我們實際上在User表中討論了多少個字段? – inkedmn

回答

3

這將是一個分析的情況。

當你發現了很多這樣的表中的字段是空值,並且可以組合在一起(如UserContactInfo),現在是時候看看提取信息,以它自己的表。

你想要避免有一個只有稀疏輸入數據的數十個/數百個字段的表。

寧可嘗試按邏輯分組數據,然後克隆包含大部分所有填充字段的主表。然後,您可以創建數據子集,就像您在UI上表示他們(聯繫信息,個人興趣,工作相關信息等)一樣。

+1

與使用稀疏輸入數據的表相關的缺點是什麼? –

3

如果檢索行的列數很多,則更爲昂貴,特別是如果您通常只需要一些字段。另外,在一個單獨的類中託管諸如地址組件之類的東西就是DRY的情況。另一方面,如果您確實需要對象的所有字段,則執行復合查詢需要更長的時間。

爲了使代碼更具可讀性(即沒有實際可重用的部分,如地址),我通常不會費心將代碼分配到多個表上。

+1

當您僅選擇需要的列時,檢索包含許多列的行是否更昂貴?或者將在同一時間執行,如果列數較少。 –

7

通常,將具有一對一關係的東西放在同一個表中是一個好主意。除非您的用戶基礎包含Queen或Paddington Bear,否則用戶只有一個生日,所以這應該是USERS表的屬性。具有一對多關係的東西應該放在單獨的表格中。所以,如果用戶可以通過所有手段將多個隱私設置分離出來。

如果我們想要一次檢索所有用戶的信息,將一張表拆分爲多個表可能會使查詢更加複雜或更慢。另一方面,如果我們有一組屬性只是以離散的方式查詢或更新,那麼使用單獨的表來保存這些數據是一個好主意。