星期二, 10月 03, 2006

Primary Key與Foreign Key

最近除了在規劃內部使用的小系統外,在家的空閒時間大都在拜讀獨孤木老大的軟體超人X光眼,增加點見識。

敝公司四年前在導入台灣最大ERP軟體公司的電子公文時,就如同此書Story 16所提,不斷地delay又一直change request。到後來都和對方工程師混熟,他們也不好意思拒絕request。此公文系統的規劃應該是在上個世紀末,約1997~1998吧(我猜的)。他們的問題與採用asp撰寫沒有關係,約爾都能用來寫出FogBugz這種高水準的軟體。我個人認為此軟體失敗在兩個地方,第一個是採用過時的RDS呼叫,而且都直接用ActiveX與DB連絡(雖然透過COM,但其實沒差別),另一個是沒有使用DB的Key來檢核,所以程式若沒有檢查到的地方,就很容易出錯。

Primary Key主要的功能就是確保資料的唯一性,另外也會自動產生一份index。Foreign Key除了能確保資料外部條件約束外,也能自我約束。例如說,在什麼都不奇怪的網站,分類樹的建立。第一個欄位是id,PK;第二個欄位是parent,FK關連到id,allow null。這樣就形成一個自我描述的tree,在parent為null的都是第一層,parent指向第一層id的都是第二層,照這樣recursion就把整個分類樹建出來。
善用PK與FK,就可以避免在程式邏輯做出過多的判斷,由DB所丟出的錯誤訊息就可以知道發生什麼事。

雖然是20世紀的產物,但是畢竟是在21世紀做的專案,怎麼會有這麼離譜的事呢?我自己學Databae是在當兵是K一本"SQL的奧秘"而已,玩MySQL和Oracle也沒做出這種恐怖的設計。後來又看到另一公司MIS做的產品,連primary key都沒有,這又是另一個故事了...

參考資料:強制資料完整性 (微軟的線上叢書還真不賴)

7 則留言:

subi 提到...

ㄧ個 Table 沒有 Primart Key 會被笑死吧......

鳥毅 提到...

是很好笑呀,但它就是這樣發生了...

阿正 提到...

雖然是三年前的文章...
剛好我最近也看到一個沒有PK的資料庫,您說這又是一段故事,那您認為當時看到的那個資料庫為什麼沒有PK?

鳥毅 提到...

阿正,通常資料庫沒有PK都是因為匯入一些非正規化的資料,而DBA/Programmer只想趕快把東西弄出來交差,而沒有考慮到後續問題。

舉例來說:員工打卡時間的資料表在國內不少打工鐘公司做出來的都沒有PK,因為他們認為用time+employee id就可以找出來,結果企業MIS要重用該資料表時卻遇到資料重覆的問題。

Terence Mak 提到...

很多老舊的系統(老舊的人)根本沒有primany key的概念....當要進行data migration的時候就慘死了 T^T

匿名 提到...

如果沒有 Primart Key 而有 UNIQUE INDEX 不知會有什麼差別

Tseng Teng-Yi 提到...

很有趣的想法,我個人認為和有primary key差不多,您可以試試