Update

使用查找表中的 PK 更新,我應該直接使用 PK 還是使用關聯的查找值選擇它?- 最佳實踐?

  • April 5, 2021

這不是徵求意見,只是比我更專業的 DBA 在這種情況下傾向於做什麼。

假設我有一個status_type 像這樣的簡單查找表,其中 status_id 是 autoinc 整數 PK,status_value 是 varchar。

status_id  status_value 
---------  ------------
       1  Active      
       2  Lapsed      
       3  Resigned    
       4  Deceased    
       5  Demurred    
       6  Terminated  
       7  Pending     
       8  Redacted

另一個表person有一個the_status INT作為 FK 連結的欄位status_type,我可以從中推斷出與該人有關的狀態字元串。這很容易維護,如果需要,我可以在不更改person記錄的情況下更改 status_value 的文本,並且可以根據需要添加新的狀態值。

如果在儲存過程中,我想更新表person並更改某人的狀態,比如“辭職”,這是最佳實踐/更常見的說法

(a) UPDATE person 
   SET the_status  = 3 
   WHERE personID = 1234;

或者

(a) UPDATE person 
   SET the_status  = (SELECT status_id 
                      FROM status_type 
                      WHERE status_value = 'Resigned' 
                     ) 
   WHERE personID = 1234;

選項 (a) 假設 ID 3 將始終與“Resigned”的含義相同,因此即使我將包含的字元串更改status_value為“離開公司”也沒關係,但它需要一個硬編碼的幻數儲存過程,我不太喜歡。

選項 (b) 不需要我將“幻數”硬編碼到儲存過程中,但需要我知道status_value表中目前保存的字元串status_type以表明有人自願不再為我們工作。因此,如果曾經編輯過status_valuein 表,則儲存過程將需要更改。status_type

任何一種方式都比另一種更廣泛使用嗎?

我確實看過這個這個

這有點接近自以為是的問題,但總的來說,我認為從數據庫層的角度來看,您會發現選項 a是最廣泛使用的選項。出於此答案的目的,出於所有意圖和目的,我將術語enum用作****查找表的同義詞。

列舉本質上旨在以數字方式賦予概念以數字含義,並具有額外的好處,即能夠使用名稱/字元串值來表達該含義。但是,列舉的特定實例的含義從該數字表示的原始含義發生變化應該是罕見的事件(實際上,如果發生這種情況,它可能會在邏輯上破壞對該列舉數值的任何現有引用)。考慮到這一點,它們不應該被視為與幻數完全相同(儘管相當接近),而且更改更靈活的是字元串值/名稱。

如果您使用選項 b,您會遇到兩個問題:

  1. status_type通過對錶進行第二次查找而不是您在選項 aUPDATE中的語句,存在性能差異(儘管在這種情況下可能可以忽略不計)。
  2. 如果您的列舉的名稱/字元串值要更改(請記住,這比更改該列舉的數值實例的潛在含義更有可能)那麼您的儲存過程現在將被破壞。

我會選擇一整天。

引用自:https://dba.stackexchange.com/questions/289303