關(guān)系型數(shù)據(jù)庫(kù)約束類型

      網(wǎ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)該通過添加惟一約束來保證這些屬性的惟一。

      關(guān)系型數(shù)據(jù)庫(kù)的約束類型

      注意:也可以使用唯一索引來實(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)容。

      上一篇:APP性能測(cè)試工具——GT 使用方法
      下一篇:干貨!攻城獅的交流分享!聊一聊開發(fā)人員快速提升自己的方式
      相關(guān)文章
      亚洲爆乳无码一区二区三区| 亚洲一区二区三区无码国产| 图图资源网亚洲综合网站| 四虎精品亚洲一区二区三区| 亚洲人成日本在线观看| 亚洲美女视频网址| 亚洲黄色片免费看| 激情内射亚洲一区二区三区| 亚洲日本一区二区| 亚洲综合在线视频| 久久精品国产亚洲AV嫖农村妇女| 亚洲人成电影在在线观看网色| 亚洲国产一区在线| 中文字幕在线观看亚洲| 亚洲精品国产肉丝袜久久| 亚洲自偷自拍另类图片二区| 亚洲精品亚洲人成在线麻豆| 亚洲最大在线视频| 亚洲jjzzjjzz在线播放| 97久久国产亚洲精品超碰热| 亚洲欧洲日本在线观看| 亚洲午夜成人精品无码色欲| 亚洲日韩精品无码专区加勒比| 亚洲欧美成人一区二区三区| 亚洲成在人线aⅴ免费毛片| 精品久久久久亚洲| 亚洲精品在线视频| 久久亚洲2019中文字幕| 亚洲精品无码不卡在线播放HE| 亚洲国产精品一区二区第一页| 亚洲av午夜福利精品一区人妖| 亚洲AV成人精品网站在线播放| 亚洲国产综合专区在线电影 | 国产成A人亚洲精V品无码| 亚洲不卡av不卡一区二区| 亚洲精品福利网站| 亚洲日韩国产精品乱-久| 亚洲av色香蕉一区二区三区蜜桃| 国产精品亚洲色婷婷99久久精品| 亚洲国产精品成人一区| 在线A亚洲老鸭窝天堂|