2010-03-11 81 views
6

只是關於連接的一個小問題。我有一個大約30個字段的桌子,我正在考慮製作第二張桌子來存儲這些字段中的10個。然後,我會加入他們的主要數據。我計劃存儲在第二個表中的10個字段不會直接被查詢,它只是第一個表中數據的一些設置。SQL Server 2008,加入還是不加入?

喜歡的東西:

Table 1 
Id 
Data1 
Data2 
Data3 
etc ... 

Table 2 
Id (same id as table one) 
Settings1 
Settings2 
Settings3 

這是一個壞的解決方案?我應該只用一張桌子嗎?它有多少性能影響?在表1中的所有條目也將不得不在表中的條目2.

小更新是爲了。大多數數據字段都是varchar類型,其中2個是文本類型。如何處理索引?我的計劃是索引2個數據字段,email(varchar 50)和author(varchar 20)。 是的,表1中的所有記錄都將在表2中記錄。大多數設置字段都是位類型,大約爲80%。其餘部分是int和varchar之間的混合。 varchars可以爲null。

回答

4

這就是所謂的vertical partitioning,這是一個合法的策略。您可能會這樣做的原因如下:

  • 如果某些列的訪問或更改比其他更頻繁。
  • 如果您希望將某些列存儲在一組存儲介質上,而將其他列存儲在另一組存儲介質上。
  • 如果您有大量觸發器不需要響應某些列上的更新而運行。

通過JOIN訪問時可能會有小的性能下降,但在只需訪問其中一個或另一個組件表的情況下,性能可能會提高。

0

表1和表2的行數是否相同?也就是說,表1中的每一行在表2中都有對應的行,反之亦然?如果是這樣,加入一個不必要的,你可以用select來過濾你想要的列。

甲加入如果有,表2中具有多於1行對應於表2的行就只能是有用的,例如一行適用於多行數據的設置。

編輯:我的問題是通過在原崗位的編輯已經回答了。我會說在這裏沒有必要加入,只會對業績產生不利影響。

4

這將取決於是否在表1中的每一行需要在表2中的行(是否每一行都有設置),以及有多少的這些設置定期NULL。

如果使用和使用的所有設置(或大部分全部)經常我會建議將它們放置在同一個表。

而且,你指的列數是不是極端的,所以單個表,避免了連接,如果使用領域是什麼,我會建議。

1

如果數據屬於一起,請將它們放在一起。

如果沒有主表數據並且與它們一一對應(即table1中的一行恰好有一行是table2),那麼您的設置沒有意義,那麼您應該將它們添加到主表中。

1

您的解決方案是不壞,但考慮以下幾點:

  1. 含有很多的商店列的數量越多和空表是,如果你想存儲的設置創建另一個表
  2. 的標誌,創建一個設計,可以存儲任意數量的設置而不存儲null,例如創建一個包含字段,primarykeyid,foreignkeyid,settingname,settingvalue的表。 請注意,在2中,您正在存儲設置名稱的頭部,但是您使用int或tiny int將會執行得更好。

希望這有助於

0

領域,頻率和使用類型的大小(選擇,更新等)和表(行)的所有事務的大小,除了方法你指數它。

一般來說,如果一個表中的數據子集非常常見(比如在列表中)並且更少查看/編輯第二個子集和/或包含非常大的字段(如varchar (最大值))。

但是,如果數據總是一起查看,這可能不是要走的路。所以如果你每次讀第一張表時都必須閱讀第二張表中的設置,不要走這條路。

更新:考慮到您的索引以及幾乎所有設置都是固定大小(位)的事實,我只是將它製成一張表。如果你需要一個沒有整個表的子集查詢,你可能想要考慮一個覆蓋索引而不是拆分表。

0

如果您要定期查詢設置表與數據表同時進行查詢,那麼您需要將它們作爲單個表。如果分別查詢每組數據,將它們區分開來可能很有用。

每個連接都有一個性能問題,但你也想看看你如何使用這些表。如果你同時需要它們,最好把它們放在一起,否則只要你不打算在未來的同一時間使用它們,就可以將它們分解。