我們讀不同的描寫數(shù)據(jù)庫的文章,會看到不同的概念名稱,從某種意義上來講,是公說公有理,婆說婆有理的問題,只是個人理解不同而稱呼有異,這也給一些人,尤其是初學者帶來一定的困擾,鑒于此,特整理《數(shù)據(jù)庫常用專業(yè)術(shù)語的基本概念的定義與理解》這篇文章,行文參考了很多網(wǎng)上的資料(請原諒我不喜歡看書),并加入了我自己的理解,如有謬誤,請指正。
實體
實體是指現(xiàn)實世界中客觀存在的并可以相互區(qū)分的對象或事物。至于如何定義一個實體,則會根據(jù)不同的需要,不同的視角有所不同,比如我們將生物作為實體,那么我們就考慮這個實體有哪些屬性,首先生物是生命體,其次可繁殖等等,也可以將某一種生物當作一個實體看待,比如人這種生物,按照人種這一屬性,可以分為黃色人種、亞美人種、蒙古人種、蒙古利亞人種等。就數(shù)據(jù)庫而言,實體往往指某類事物的集合。也就是數(shù)據(jù)庫表,可以是具體的人、事、物,也可以是抽象的概念、
實體屬性
屬性是實體之間相互區(qū)分的最基本特征,是對象或事物具象的描述。比如有兩個人,一個姓名叫張三、一個叫姓名李四,那么姓名就是張三、李四這兩個實體相互區(qū)分的屬性。值得注意的是,實體屬性依然會根據(jù)我們視角的不同而有不同的劃分。
數(shù)據(jù)庫
數(shù)據(jù)庫就是存儲數(shù)據(jù)的倉庫,其本質(zhì)是一個文件系統(tǒng),數(shù)據(jù)按照特定的格式將數(shù)據(jù)存儲起來,可視為電子化的文件倉庫。數(shù)據(jù)庫分為關系數(shù)據(jù)庫與非關系數(shù)據(jù)庫(NoSql數(shù)據(jù)庫)。數(shù)據(jù)庫實現(xiàn)了數(shù)據(jù)的新增、查詢、更新、刪除等操作,并提供了完善的數(shù)據(jù)管理相關的功能,如權(quán)限、事務等,并定義了表(實體)與表(實體)之間的關系。
數(shù)據(jù)表
數(shù)據(jù)庫中以表為組織單位存儲數(shù)據(jù)。表與實體之間應該是一一對應的關系,可以把表當作實體在數(shù)據(jù)庫中的描述。數(shù)據(jù)庫表描述的實體是具有一些列共同實體屬性的數(shù)據(jù)的集合,比如學生表,描述了學生這一實體,而學校表描述了學校這一實體,將學生與學校分別建表存儲。這里容易讓人迷糊的是在個別時候,數(shù)據(jù)表中的一行記錄也被叫做實體,這個確實也是對的,這是因為將學生看作實體與將某一個學生看作一個實體的時候我們的視角不一樣了。是不是感覺很隨意?是的就是這么隨意。
字段
字段是數(shù)據(jù)表中實體所具有的某一特性,在關系數(shù)據(jù)庫中,屬性可以看作是“表的一列”。如上面學生這一尸體可能具有姓名、性別、年齡、愛好等屬性,對應到學生表中則是姓名、性別、年齡、愛好等字段。
元組(記錄/行)
表中的一行記錄就是一個元組,元組也稱為行。
分量(字段/屬性)
元組的某個屬性值叫做分量,實際上就是數(shù)據(jù)庫中的字段,也即實體的屬性。在一個關系數(shù)據(jù)庫中,它是一個操作原子,即關系數(shù)據(jù)庫在做任何操作的時候,屬性是“不可分的”。否則就能滿足數(shù)據(jù)庫范式。
碼(主鍵、主關鍵字)
碼也就是我們常說的主鍵、主關鍵字,他們都是一個意思。
碼是能唯一標識實體的屬性,它是整個實體集的性質(zhì),而不是單個實體的性質(zhì)。它包括外碼、候選碼和主碼。表中可以唯一確定一個元組的某個屬性(或者屬性組),如果這樣的碼有不止一個,那么大家都叫 候選碼,我們從候選碼中挑一個出來做老大,它就叫主碼。
如果一個碼包含了所有的屬性,這個碼就是全碼。
一個屬性只要在任何一個候選碼中出現(xiàn)過,這個屬性就是主屬性
一個屬性(或?qū)傩越M),它不是碼,但是它別的表的碼,它就是外碼。
若關系中的某一屬性或?qū)傩越M的值能唯一的標識一個元組,而其任何真子集都不能再標識,則稱該屬性組為(超級碼)候選碼。
數(shù)據(jù)完整性約束
數(shù)據(jù)完整性約束指的是為了防止不符合規(guī)范的數(shù)據(jù)進入數(shù)據(jù)庫,在用戶對數(shù)據(jù)進行插入、修改、刪除等操作時,DBMS自動按照一定的約束條件對數(shù)據(jù)進行監(jiān)測,使不符合規(guī)范的數(shù)據(jù)不能進入數(shù)據(jù)庫,以確保數(shù)據(jù)庫中存儲的數(shù)據(jù)正確、有效、相容。
我們常見的有:
not null(非空)約束:定義字段不能為空值,如果新增數(shù)據(jù)非空約束的字段值為空,則不能寫入并報錯。
unique(惟一)約束:用于指明創(chuàng)建惟一約束的列上的取值必須惟一。
primary key(主鍵)約束:用于定義基本表的主鍵,起唯一標識作用,其值不能為null,也不能重復,以此來保證實體的完整性。
foreign key(外鍵)約束:定義了一個表中數(shù)據(jù)與另一個表中的數(shù)據(jù)的聯(lián)系。
check(校驗)約束:用來檢查字段值所允許的范圍。DBMS每當執(zhí)行delete,insert或update語句時,都對這個約束過濾。如果為true,則執(zhí)行。否則,取消執(zhí)行并提示錯誤。
范式
英文名稱是 Normal Form,它是英國人 E.F.Codd(關系數(shù)據(jù)庫的老祖宗)在上個世紀70年代提出關系數(shù)據(jù)庫模型后總結(jié)出來的,范式是關系數(shù)據(jù)庫理論的基礎,也是我們在設計數(shù)據(jù)庫結(jié)構(gòu)過程中所要遵循的規(guī)則和指導方法。
設計關系數(shù)據(jù)庫時,遵從不同的規(guī)范要求,設計出合理的關系型數(shù)據(jù)庫,這些不同的規(guī)范要求被稱為范式,各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小,但也意味著數(shù)據(jù)庫表關系越復雜。
目前關系數(shù)據(jù)庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。
巴斯-科德范式因為并沒有定義新的規(guī)范,只是對第三范式(3NF)的補充與完善,所以并沒有命名為第四范式。
通常所用到的只是前三個范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。也即我們常說的設計數(shù)據(jù)庫的三大范式。
依賴關系
數(shù)據(jù)依賴是一個數(shù)學概念,是通過一個關系中屬性間值的相等與否體現(xiàn)出來的數(shù)據(jù)間的相互關系,數(shù)據(jù)依賴是現(xiàn)實世界屬性間相互聯(lián)系的抽象,屬于數(shù)據(jù)內(nèi)在的性質(zhì)。在計算機科學中,數(shù)據(jù)依賴是指一種狀態(tài),當程序結(jié)構(gòu)導致數(shù)據(jù)引用之前處理過的數(shù)據(jù)時的狀態(tài)。
復雜的數(shù)學公式推導有興趣的朋友可以自行查看。
簡單來說在數(shù)據(jù)庫中依賴關系就是描述數(shù)據(jù)庫不同字段(屬性)之間的關系。比如管理員id 依賴倉庫id, 物品id 依賴倉庫id。在這個以來關系中管理員id 到物品id是存在依賴關系的,依賴關系對于理解數(shù)據(jù)庫范式很重要。
非關系數(shù)據(jù)庫
各個數(shù)據(jù)之間存在關聯(lián)是關系型數(shù)據(jù)庫得名的主要原因,為了進行join處理,關系型數(shù)據(jù)庫不得不把數(shù)據(jù)存儲在同一個服務器內(nèi),這不利于數(shù)據(jù)的分散,這也是關系型數(shù)據(jù)庫并不擅長大數(shù)據(jù)量的寫入處理的原因。相反NoSQL數(shù)據(jù)庫原本就不支持Join處理,各個數(shù)據(jù)都是獨立設計的,很容易把數(shù)據(jù)分散在多個服務器上,故減少了每個服務器上的數(shù)據(jù)量,即使要處理大量數(shù)據(jù)的寫入,也變得更加容易,數(shù)據(jù)的讀入操作當然也同樣容易。
關系型數(shù)據(jù)庫應用廣泛,能進行事務處理和表連接等復雜查詢。相對地,NoSQL數(shù)據(jù)庫只應用在特定領域,基本上不進行復雜的處理,但它恰恰彌補了之前所列舉的關系型數(shù)據(jù)庫的不足之處。
典型的NoSQL數(shù)據(jù)庫:臨時性鍵值存儲(memcached、Redis)、永久性鍵值存儲(ROMA、Redis)、面向文檔的數(shù)據(jù)庫(MongoDB、CouchDB)、面向列的數(shù)據(jù)庫(Cassandra、HBase)。