一、關(guān)系型數(shù)據(jù)庫中的字段默認(rèn)值、不可為空、少數(shù)索引約束的優(yōu)缺點(diǎn)
1.字段默認(rèn)值:針對每個(gè)字段都有自己的默認(rèn)值,較有利于進(jìn)行統(tǒng)計(jì)和分析,以及方便程序邏輯操作;
2.不可為空:若是該字段創(chuàng)建為索引情況下,且允許為NULL,則存儲多個(gè)值,若是不允許為空,可能用某一個(gè)值替代,則索引值更少,以及部分?jǐn)?shù)據(jù)庫產(chǎn)品不支持字段為NULL情況下創(chuàng)建索引(特別是早期的數(shù)據(jù)庫產(chǎn)品)。
3.少數(shù)性約束:那是指有數(shù)據(jù)少數(shù)性要求的情況下,可以借助數(shù)據(jù)庫的方式判斷是否存在重復(fù)值,而避免程序去判斷,減少事務(wù)的處理等。
六大約束:
not null 非空 :用于保障該字段的值不能為空, 比如姓名、學(xué)號等
Default 默認(rèn): 用于保證該字段有默認(rèn)值,比如性別、
PRIMARY KEY 主鍵: 用于保證該字段的值有少數(shù)性,并且 非空。是能夠少數(shù)的標(biāo)識一組數(shù)據(jù)的數(shù)據(jù)元素;比如說:學(xué)號,姓名,年齡,性別,課程號課程中學(xué)號是少數(shù)的
UNIQUE 少數(shù)約束: 用于保障該字段的值有少數(shù)性,可以為空, 比如座位號
Check 檢查約束:mysql中不支持,但不報(bào)錯(cuò)
Foreign KEY 外鍵:用于限制兩個(gè)標(biāo)的關(guān)系 用于保證該字段的值必須來自于主表關(guān)聯(lián)的值。 一組數(shù)據(jù)的主鍵是另一組數(shù)據(jù)的的元素;主鍵約束了外鍵所在表中不能存在主鍵類之外的值;外鍵用于與另一張表的關(guān)聯(lián)。比如:學(xué)生表的專業(yè)編號、員工表的部門編號。
延伸閱讀:
二、索引維護(hù)
B+樹為了維護(hù)索引有序性,在插入新值的時(shí)候需要做必要的維護(hù)。以上面這個(gè)圖為例,如果插入新的行ID值為700,則只需要在R5的記錄后面插入一個(gè)新記錄。如果新插入的ID值為400,就相對麻煩了,需要邏輯上挪動后面的數(shù)據(jù),空出位置。
而更糟的情況是,如果R5所在的數(shù)據(jù)頁已經(jīng)滿了,根據(jù)B+樹的算法,這時(shí)候需要申請一個(gè)新的數(shù)據(jù)頁,然后挪動部分?jǐn)?shù)據(jù)過去。這個(gè)過程稱為頁分裂。在這種情況下,性能自然會受影響。
除了性能外,頁分裂操作還影響數(shù)據(jù)頁的利用率。原本放在一個(gè)頁的數(shù)據(jù),現(xiàn)在分到兩個(gè)頁中,整體空間利用率降低大約50%。
當(dāng)然有分裂就有合并。當(dāng)相鄰兩個(gè)頁由于刪除了數(shù)據(jù),利用率很低之后,會將數(shù)據(jù)頁做合并。合并的過程,可以認(rèn)為是分裂過程的逆過程。