有一次用戶問我為什么數據表中都要添加一個業務無關的ID字段
這個問題當時真的不知道怎么回答,只是說Hibernate框架就是這么要求的。后來翻了上學時候的書《數據庫系統設計 實現與管理》(第六版)第73頁3.3節“表3-4 完整性規則”中要求:
1. 實體完整性
1.1 要求:所有主鍵標實體都是惟一的,而且主鍵標的任何部分不可以是空值;
1.2 目的:保證每一個實體會有惟一的標識,并且確保外鍵標值可以正確的引用主鍵標值;
1.3 示例:沒有發票可以具有重復的編號,也不可以是空值??傊邪l票由它們的發票編號惟一的標識。
用戶發難:人員表中工號是唯一的,為什么不用工號作為主鍵?
回答:分析了需求后,發現,人員表中工號存在“回收復用”的情況。比如,局長的工號永遠都是00001,今年是李局長,明年李局長升遷了、退休了,張局長赴任,工號還是00001。如果用工號作為主鍵,那么子表引用人員表工號字段,就會出現以下情況:
1、2008年工號為00001的用戶操作了100條業務,該工號00001代表李局長;
2、2009年工號為00001的用戶操作了80條業務,該工號00001代表張局長。
最后統計工號為00001的用戶一共操作了多少業務的時候,會得到工號為00001的張局長操作了180條業務。
因此,工號雖然在庫表中唯一,但是他違背了“所有主鍵標實體都是惟一的”這一完整性要求,因此,不能將工號作為主鍵。
1. 實體完整性
1.1 要求:所有主鍵標實體都是惟一的,而且主鍵標的任何部分不可以是空值;
1.2 目的:保證每一個實體會有惟一的標識,并且確保外鍵標值可以正確的引用主鍵標值;
1.3 示例:沒有發票可以具有重復的編號,也不可以是空值??傊邪l票由它們的發票編號惟一的標識。
用戶發難:人員表中工號是唯一的,為什么不用工號作為主鍵?
回答:分析了需求后,發現,人員表中工號存在“回收復用”的情況。比如,局長的工號永遠都是00001,今年是李局長,明年李局長升遷了、退休了,張局長赴任,工號還是00001。如果用工號作為主鍵,那么子表引用人員表工號字段,就會出現以下情況:
1、2008年工號為00001的用戶操作了100條業務,該工號00001代表李局長;
2、2009年工號為00001的用戶操作了80條業務,該工號00001代表張局長。
最后統計工號為00001的用戶一共操作了多少業務的時候,會得到工號為00001的張局長操作了180條業務。
因此,工號雖然在庫表中唯一,但是他違背了“所有主鍵標實體都是惟一的”這一完整性要求,因此,不能將工號作為主鍵。
posted on 2009-10-21 10:55 Rick Qin 閱讀(556) 評論(0) 編輯 收藏 所屬分類: DB