假設我們有作業的表像這樣:將外鍵綁定到非主鍵時是否有任何缺點?
- 作業(ID,數量);
假設我們有一個客戶的要求來跟蹤工作時間,我們創建了一個表像這樣:
- (A)job_timer(ID,JOB_ID,時間戳);
,但我們有我們要如何把它綁job
表的選擇,所以我們也可以:
- (B)job_timer(ID,job_number,時間戳);
假設job_number是UNIQUE
。
我條件反射地使基於ID的外鍵,所以A)job_id
是我見過它做的方式。但是,客戶正在按職位編號查找職位,如果我直接通過B)job_number
進行查詢,它可以爲我和數據庫節省一些工作量。但我應該這樣做嗎?
通過更多的工作使用job_id
我的意思時,即給定的作業數量,我只需要使用job_timer
表。當給出job_id
我需要配合這兩個表 - 更多的認知編程工作,更多的數據庫工作。
請注意,類似的問題Foreign Key to non-primary key解決了非主鍵的唯一性問題,但我不認爲它解決了我的問題。
原始表(job
)是遺留代碼庫的一部分,其中字段id
和number
在整個代碼中廣泛使用,從這個意義上說,我有一個「拆分主鍵」條件。由於缺乏全面的測試覆蓋率,除去這一點將會令人望而卻步。爲什麼number
字段被創建,並且爲什麼它被作爲varchar是很好的問題。我確信在某個時刻一定有一個理由。
我正在尋找類似「是的,繼續它完全好,有在這種情況下沒有最佳實踐」,或「沒有,如果你這樣做,你可能會遇到的問題,X,Y,Z在將來」。
噢,對了......多個匹配的父母ID將會模棱兩可......我應該趕上睡眠。 –
如果'job'表中的'number'是唯一的,那麼你應該使_that_主鍵完全擺脫'id'列(因爲它顯然不會爲表添加任何值)。這意味着工作號碼也永遠不會改變。 –
@ horse:很好! 'id'字段是多餘的... – Dennis