一、數(shù)據(jù)庫設計時保持單個表的獨立性的利弊
利:單表數(shù)據(jù)的可維護性變強。 不會出現(xiàn)刪除這個表的數(shù)據(jù)影響到別的表的“意外”發(fā)生。對單張表的DML在特定情況下性能強于外鍵串起來的表
弊:數(shù)據(jù)的一致性可能會受到影響。
一般推薦業(yè)務性很強的數(shù)據(jù)庫(OA,ERP)用外鍵 。而線上網(wǎng)站對外提代訪問多數(shù)建議用獨立表的然后輔以程序完成約束。
主關鍵字約束
主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。
此處應有說明:多列組成的主鍵叫聯(lián)合主鍵,而且聯(lián)合主鍵約束只能設定為表級約束;單列組成的主鍵,既可設定為列級約束,也可以設定為表級約束。
聯(lián)合主鍵:聯(lián)合主鍵就是用2個或2個以上的字段組成主鍵。用這個主鍵包含的字段作為主鍵,這個組合在數(shù)據(jù)表中是少數(shù),且加了主鍵索引。
可以這么理解,比如,你的訂單表里有很多字段,一般情況只要有個訂單號bill_no做主鍵就可以了,但是,現(xiàn)在要求可能會有補充訂單,使用相同的訂單號,那么這時單獨使用訂單號就不可以了,因為會有重復。那么你可以再使用個訂單序列號bill_seq來作為區(qū)別。把bill_no和bill_seq設成聯(lián)合主鍵。即使bill_no相同,bill_seq不同也是可以的。
延伸閱讀:
二、外關鍵字約束是什么
外關鍵字約束定義了表之間的關系。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,并設定它適合哪個表中哪些列相關聯(lián)。這樣,當在定義主關鍵字約束的表中更新列值,時其它表中有與之相關聯(lián)的外關鍵字約束的表中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還體現(xiàn)在,當向含有外關鍵字的表插入數(shù)據(jù)時,如果與之相關聯(lián)的表的列中無與插入的外關鍵字列值相同的值時,系統(tǒng)會拒絕插入數(shù)據(jù)。與主關鍵字相同,不能使用一個定義為 TEXT 或IMAGE 數(shù)據(jù)類型的列創(chuàng)建外關鍵字。外關鍵字非常多由16 個列組成。
指定在刪除表中數(shù)據(jù)時,對關聯(lián)表所做的相關操作。在子表中有數(shù)據(jù)行與父表中的對應數(shù)據(jù)行相關聯(lián)的情況下,如果指定了值CASCADE,則在刪除父表數(shù)據(jù)行時會將子表中對應的數(shù)據(jù)行刪除;如果指定的是NO ACTION,則SQL Server 會產(chǎn)生一個錯誤,并將父表中的刪除操作回滾。NO ACTION 是缺省值。
ON UPDATE {CASCADE | NO ACTION}
指定在更新表中數(shù)據(jù)時,對關聯(lián)表所做的相關操作。在子表中有數(shù)據(jù)行與父表中的對應數(shù)據(jù)行相關聯(lián)的情況下,如果指定了值CASCADE,則在更新父表數(shù)據(jù)行時會將子表中對應的數(shù)據(jù)行更新;如果指定的是NO ACTION,則SQL Server 會產(chǎn)生一個錯誤,并將父表中的更新操作回滾。NO ACTION 是缺省值。
NOT FOR REPLICATION
指定列的外關鍵字約束在把從其它表中復制的數(shù)據(jù)插入到表中時不發(fā)生作用。