2014-05-19 35 views
0

我得到一個系統,該系統有一張表格來跟蹤客戶數據變化的每週變化。每週的記錄都會創建一個帶有customer_id和相關聯的action_id的新file_id編號,這將是一個更新'U'。它有以下主鍵。刪除主鍵最佳實踐

ALTER TABLE t_customer_file 
ADD CONSTRAINT CUSTF_PK PRIMARY KEY (file_id, customer_id, action_id); 

現在需要更改,以便客戶更新可以在一週內出現兩次。因此,file_id,customer_id和action_id將相同,因此主鍵無法使包填充此表。

所以我只是想知道最好的做法是去除和引入新的主鍵或沒有主鍵?

此刻我已經丟棄了主鍵。然後我用一個索引代替同名的相同字段。我會用更多的列創建一個新的主鍵,但表中只有5個列,每個列只包含已更新內容的數據。以下是我執行的重複行,並編譯了一個使用t_customer_file中的數據的視圖。

alter table t_customer_file 
drop constraint CUSTF_PK 
drop index; 

create index CUSTF_PK on t_customer_file (file_id,customer_id,action_id); 

alter view customer_file compile; 

對這種情況下的最佳實踐的任何幫助將是偉大的。

+1

聽起來你應該創建另一列,比如'change_date',它包含發生更改的日期。然後讓你的主鍵'file_id,customer_id,action_id,change_date'如果你每週有兩次更改,現在你不知道你最先發生了哪一次? –

+0

@ElectricLlama:時間戳可能比日期還要好。 –

+0

很可能。我會留下原始的海報來反思。 –

回答

0

我會添加一個新的列「id」作爲主鍵,並且改變應用程序邏輯以接受file_id,customer_id和action_id組合的多個記錄。爲file_id,customer_id和action_id添加索引很好。我以前從stackoverflow獲得的一個好建議是,每個表都應該有一個不代表應用程序數據的主鍵。因此,添加一個新的主鍵列「id」(其目的是使列唯一)是可以的。

alter table t_customer_file add (id number(22) primary key) 

你也可以按這個新ID排序,或者你可以在上面的評論中添加一個日期/時間戳列。

+0

*「因此,添加一個新的主鍵列」id「(其目的是使列唯一)是可以的。」*除了它允許重複數據,這是主鍵約束被假定的事情阻止。 –

+1

我不同意這是最佳做法。有時候這種懶惰是因爲設計師不會爲制定真正的商業關鍵而煩惱。 –

+0

@ MikeSherrill'CatRecall'它取決於角度。 「file_id + customer_id + action_id」的組合將不再是唯一的。但是如果你添加新的「id」列,它們是唯一的。但您必須更改應用程序邏輯,以便期望具有相同「file_id + customer_id + action_id」組合的多個記錄。 –