2016-11-30 100 views
0

這可能是一個愚蠢的問題。SQL Server表設計建議

SQL Server 2008 R2的一些效率建議,儘管這些服務器將在未來幾個月內升級到2014年。我正在創建3個表格。

  • t1有許多不同類型的列和一個身份數字ID是主鍵。我預計這張桌子可以進入1000個行的低位。

  • t2與t1具有一對多的關係。它的主鍵將是一個t2 ID和t1 ID的組合。 t2數字ID將由前端應用程序發送,並且每個t1 ID都是唯一的。我預計這張桌子可以達到50000多排。除了這兩個ID之外,它將包含一些不同長度的varchar列。

  • t3與t2具有一對多的關係。它的主鍵可以是t3 ID,t1 ID和t2 ID的組合。 t3數字ID將再次由前端應用程序發送,並且對於每個t2 ID將是唯一的。我預計這張桌子會達到幾百萬行。除了這3個ID之外,它將包含少量的日期或數字列。

我的問題是T2內應該我建立標識列,其T3將指基本上意味着T3的主鍵將是2列而不是3,即T3 ID和從時刻t2的標識列。這會更有效率嗎? t2中的這個標識列是否應該編入索引?幫助加入?

我應該做其他事嗎?

+0

您最常執行哪種搜索?你會使用't1'還是't2'鍵搜索't3'還是會使用來自其他字段的數據?您的答案可能會使代理或自然鍵成爲更好的選擇。 – Tony

+0

在** t2 **和** t3 **中,不太可能會獨立執行任何搜索,雖然這可能會在將來出現,儘管我懷疑它。對這些表的查詢將由連接到** t1 **驅動。絕大多數日間搜索將用於1個t1記錄,並且對於該t1個ID以及對於那些t1 | t2個ID在t3中的任何內容。 – Darybrain

回答

0

我首先想到的擔憂的聲明

...的[T2 | T3]數字ID將通過前端應用 發送...

如果生成唯一標識符爲了在數據庫中使用,我建議你讓數據庫生成數字。除非您可以絕對確定該應用程序不會生成重複的ID。

在回答您的意見,使用代理鍵時(如果我理解正確的表結構)

 
    +----+ +----+ +----+ 
    | | | | | | 
    | t1 +---+ t2 +---+ t3 | 
    | | | | | | 
    +----+ +----+ +----+ 

keys: t1.id t1.id t1.id 
       t2.id t2.id 
         t3.id 

到代理鍵的變化不會改變t1(不需要),這裏的區別; t2也將保持不變,但您需要將t2.id從行號更改爲唯一號碼主鍵[pk]。麻煩的是,你必須將'行號'作爲另一個字段存儲在表中。

主要區別在於t3只需要t2.pk及其自己的行標識符,而不是全部三個表標識符。

 
     +----+ +----+ +----+ 
     | | | | | | 
     | t1 +---+ t2 +---+ t3 | 
     | | | | | | 
     +----+ +----+ +----+ 

keys: t1.id  t2.pk t2.pk 
       t1.id t3.pk 

這會更好嗎?我不確定。它也將取決於您對錶格運行的查詢的類型和頻率(請參閱我對您問題的評論)。

如果你主要是由id查詢,則第一個佈局將是最好的 - 在t3查找行,而不必加盟t2t1。但是,如果您需要從其他表中獲取信息來進行搜索,則代理鍵結構可能會使您的聯接更加冗長。

最終,這是所有不成熟的優化(在查詢性能方面),因爲直到實現它纔會知道執行得最好。

+0

他們應該永遠是獨一無二的。在前端,t2 ID基本上是每個t1記錄中屏幕上的行號。當數據在前端內更改時,應用程序應檢查記錄是否存在,以查看是否需要生成動態更新或插入SQL語句。你會建議什麼結構?如果我使用單列身份作爲主鍵,我仍然需要根據表格存儲[t1 | t2]或[t1 | t2 | t3]的組合。在數據庫中確保這些內容不重複的最好方法是什麼? – Darybrain

+0

@Darybrain - 我已經更新了我的回答以迴應您的評論。 – Tony

0

我通常爲此創建標識int主鍵,並使其成爲聚簇索引。

我不會有t2或t3有一個id是複合,而是一個單獨的字段,並設置一個外鍵約束。

聚集索引和外鍵將成爲您需要的所有索引(用於連接)。您可能需要基於您的查詢的其他索引。

我已經在具有數億行的表上設置了它,並在1秒內獲得查詢結果。

+0

以t2爲例,如果我創建一個標識列作爲集羣主節點,我仍然需要從表中的前端應用程序獲得t1標識和t2標識(基本上是每個t1記錄的行號)。如何確保兩者的組合不會重複?這兩個領域會在你提到的限制之內嗎? – Darybrain

+0

@Darybrain - 您可以在關鍵字段使用'UNIQUE'索引來防止重複,同時擁有一個數字鍵字段。 – Tony

+0

爲什麼前端生成密鑰?除非應用程序正在控制多個數據存儲,否則我不明白需要。 @Darybrain也是正確的,你可以添加一個唯一的約束來防止重複,但這會導致錯誤,你將不得不陷入和處理。關鍵問題是爲什麼前端對RDBMS有任何控制。 –