【云圖說】第235期 DDS讀寫兩步走 帶您領(lǐng)略只讀節(jié)點(diǎn)的風(fēng)采
811
2022-05-30
目錄
文章目錄
目錄
前言
約束
非空約束
唯一約束
主鍵約束
外鍵約束
Check 約束
默認(rèn)約束
索引約束
參考文檔
前言
我們不應(yīng)該只把數(shù)據(jù)庫(kù)系統(tǒng)看作是保存數(shù)據(jù)的黑盒子,而要將其看成驗(yàn)證和防止數(shù)據(jù)腐化的工具。
約束
非空約束
如果業(yè)務(wù)規(guī)則要求該屬性應(yīng)該始終存在,那么要毫不猶豫地將其設(shè)置為 Not Null。
適合設(shè)置為 Not Null 的字段有 Id、Name、AddedDate、IsActive、State、CategoryId(如果所有項(xiàng)都應(yīng)該有一個(gè)類別)、ItemCount、Price 以及許多其他字段。通常,這些屬性在業(yè)務(wù)邏輯中扮演重要角色。
但是要注意,不要對(duì)可以為空的屬性使用 Not Null 約束。
唯一約束
根據(jù)業(yè)務(wù)規(guī)則,一些屬性(或?qū)傩缘慕M合)應(yīng)該是惟一的,比如 Id、PinNumber、BookId 和 AuthorId、OrderNo 等。應(yīng)該通過添加惟一約束來保證這些屬性的惟一。
注意:也可以使用唯一索引來實(shí)現(xiàn)同樣的效果,但是添加約束是更好的方法。因?yàn)楫?dāng)添加惟一約束時(shí),會(huì)自動(dòng)創(chuàng)建非惟一索引。因此,如果出于某種原因,你必須臨時(shí)禁用/啟用約束,將會(huì)非常容易。在使用唯一索引的情況下,你必須刪除/重新創(chuàng)建索引,從性能和時(shí)間方面來說,這是一個(gè)昂貴的操作。
主鍵約束
Not Null 和唯一約束一起構(gòu)成主鍵。
當(dāng)我們想到主鍵時(shí),會(huì)很快想到 Id 或 ObjectId 之類的列。但是主鍵也可以是復(fù)合的,比如 BookId 和 AuthorId。這里有個(gè)難題是,是使用單獨(dú)的 Id 列作為主鍵,還是將兩者的組合作為主鍵?
通常,使用單獨(dú)的 Id 列是一種更好的方法,因?yàn)樗梢允惯B接更加清晰,還能方便地將另一列添加到惟一組合中。但是,即使有了一個(gè)單獨(dú)的主鍵(Id),我們還是要為 BookId 和 AuthorId 列添加唯一約束。
外鍵約束
外鍵與主鍵一起確保表之間的數(shù)據(jù)一致性。
使用外鍵約束時(shí)要注意區(qū)分 On Delete 和 On Update 規(guī)則,根據(jù)數(shù)據(jù)庫(kù)的不同,兩者均有 NoAction、Restrict、SetNull、SetDefault 和 Cascade 選項(xiàng)。在大多數(shù)情況下,Restrict 與 NoAction 是相同的,但是對(duì)于某些數(shù)據(jù)庫(kù),它們有細(xì)微的區(qū)別。
通常,對(duì)于鍵引用查找或不引用實(shí)體的實(shí)體,我們選擇 NoAction。
另一方面,當(dāng)子記錄不能在沒有父記錄的情況下存在時(shí),選擇 Cascade。
SetNull 很少使用。例如,Employee.ManagerId 和 Employee.Id 之間的外鍵可以是 SetNull。當(dāng)一名經(jīng)理被撤職,他的下屬就沒經(jīng)理了。顯然,只有當(dāng)列可為空時(shí)才能選擇該項(xiàng)規(guī)則。
SetDefault 最罕見。當(dāng)父記錄被刪除時(shí),它將列設(shè)置為其默認(rèn)值。因?yàn)橥怄I引用主鍵,我們很難想象一個(gè)有外鍵的字段將默認(rèn)值硬編碼。
Check 約束
Check 約束允許我們定義數(shù)據(jù)的有效值/范圍。適合 Check 約束的屬性有百分比(0 到 100 之間)、狀態(tài)(0、1、2)、價(jià)格、金額、總數(shù)(大于或等于 0)、PinNumber(固定長(zhǎng)度)等。
默認(rèn)約束
默認(rèn)約束允許我們向現(xiàn)有表中添加新的 Not Null 列,并使 “舊” API 與新結(jié)構(gòu)兼容,直到所有各方都完成升級(jí)(盡管在完全升級(jí)后,默認(rèn)約束應(yīng)該刪除)。
索引約束
索引是良好數(shù)據(jù)庫(kù)設(shè)計(jì)的重要組成部分,但它們幾乎不能保護(hù)我們的數(shù)據(jù)(惟一索引除外)。
需要注意的一點(diǎn)是:一些 RDBMS 系統(tǒng)(例如 Oracle)會(huì)在創(chuàng)建外鍵時(shí)自動(dòng)創(chuàng)建索引,而無需我們操心。其他數(shù)據(jù)庫(kù)(例如 MS SQL Server)不會(huì)這樣做,我們必須自己添加索引。
參考文檔
https://mp.weixin.qq.com/s/tdi23o_9GWkCdVaYYq1Grw
數(shù)據(jù)庫(kù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。