2012-06-15 45 views
1

關於設計存儲過程的最佳實踐,更新表中記錄的存儲過程是否應使用主鍵標識要更新的記錄或唯一密鑰?通過主鍵或唯一鍵更新記錄

唯一密鑰看起來像很多額外的參數發送,我想不出主鍵不知道的情況。

+0

爲什麼標記爲Oracle和T-SQL?什麼是'WorkStudyID'?主鍵_is_是唯一的。答案是有效的,「取決於」_和_「它們總是一樣好」_因此投票結束。 PS我經常不知道程序中的PK。 – Ben

+1

請給我一個不是唯一的主鍵 – SQLMason

回答

1

這個問題有兩個不同的方面。

  • 目標:你想實現的是更新給定的行。任何允許你達到這一點的方法都是好的;換句話說,如果任何唯一性約束下未列出的唯一鍵,主鍵或任何其他列的組合都沒有問題,那麼您可以使用它。
  • 表演:與其他任何查詢一樣,您真的想要快速且直截了當。這是什麼意思?這意味着你必須在你的where子句中選擇效率最高的過濾器。您可以通過測量此:

1 /你正在使用的索引的大小:選擇最小的一個(例如柱尺寸)

2 /索引你的列的NOT NULL屬性正在使用:(如果您的引擎允許在可空列上使用唯一索引)最好選擇放置在不可空列上的索引。

3 /索引的表空間:你也可以看到,如果有一個指數,而不是另一個特殊的存儲,這將提高性能(安裝索引...)

4 /列類型:通常小數字比文本更快解析(道歉沒有來源,小心)

我現在想不到更多,但我敢肯定其他人將完成列表。

乾杯。

+0

在我看來,爲了更新記錄,必須在6個字段中傳遞更多的額外努力。這似乎也會對性能造成影響,因爲此表可能有幾百萬行。 – StoneJedi

+0

好,取決於6個字段的大小。你真的有這些領域的唯一索引? – Sebas

2

「獨一無二的鑰匙」我假設你的意思是「商業鑰匙」。如果您的數據庫與某些外部來源鬆散地同步,那麼業務密鑰可以很好地用作存儲過程的參數。

比方說,您收到來自其他公司的平面文件,以訂購產品,激活服務,啓動流程等。他們可能不知道主鍵,並且可能按名稱請求:(公司X,服務Y,激活),您根據唯一公司名稱,唯一服務名稱,唯一狀態調用您的存儲過程。當然,你可能會說遠程系統應該使用ID,但有時你不能控制它。

另一個示例:在應用程序級別執行復制。這兩個數據塊之間的序列可能不同步,因此通過業務密鑰來引用遠程記錄會更安全。

+0

我想是的,這是唯一識別記錄的字段。我們知道表的主鍵,所以它不會很難得到,並且似乎也簡化了過程調用。我想知道這是否會影響我們使用ORM的能力。我知道一些ORM可以通過一個唯一的鍵來完成,但他們似乎更喜歡主鍵。 – StoneJedi

+0

我這樣看:pk id本身沒有意義。它充當記錄(參考)的唯一標識符。它使事情變得更容易。由唯一(COUNTRY,STATE)定義的銷售區域可以具有TERRITORY_ID作爲參考(pk)。它只在內部有意義。在外部,國家/地區對是如何參考的(「誰是US-FL領地的代表?」)只要事物是獨立的,pk是最簡單和有意義的,但是在交易時它可以很快破裂與外部系統和數據源。然後,業務密鑰更適合服務apis。 – Glenn