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