哈嘍大家好,我是阿Q,今天我們來總結一下【MySQL】 入門的必備知識點吧~
數(shù)據(jù)庫的基本概念
- 數(shù)據(jù)庫:DataBase 簡稱 DB,就是信息的集合或者說數(shù)據(jù)庫是由數(shù)據(jù)庫管理系統(tǒng)管理的數(shù)據(jù)的集合。
- 數(shù)據(jù)庫管理系統(tǒng):DataBase Management System 簡稱 DBMS,是一種操縱和管理數(shù)據(jù)庫的大型軟件,通常用于建立、使用和維護數(shù)據(jù)庫。
- 數(shù)據(jù)庫管理員:DataBase Administrator, 簡稱 DBA,負責全面管理和控制數(shù)據(jù)庫系統(tǒng)。
什么是元組, 碼, 候選碼, 主碼, 外碼, 主屬性, 非主屬性?
- 元組:元組(tuple)是關系數(shù)據(jù)庫中的基本概念,關系是一張表,表中的每行(即數(shù)據(jù)庫中的每條記錄)就是一個元組,每列就是一個屬性。 在二維表里,元組也稱為行。
- 碼:碼就是能唯一標識實體的屬性,對應表中的列;
- 候選碼: 若關系中的某一屬性或?qū)傩越M的值能唯一的標識一個元組,而其任何、子集都不能再標識,則稱該屬性組為候選碼。我理解的是一個字段或者多個字段組成唯一索引。例如:在學生實體中,“學號”是能唯一的區(qū)分學生實體的,同時又假設“姓名”、“班級”的屬性組合足以區(qū)分學生實體,那么{學號}和{姓名,班級}都是候選碼。
- 主碼:主碼也叫主鍵。主碼是從候選碼中選出來的。 一個實體集中只能有一個主碼,但可以有多個候選碼。
- 外碼:外碼也叫外鍵。如果一個關系中的一個屬性是另外一個關系中的主碼則這個屬性為外碼。
- 主屬性:候選碼中出現(xiàn)過的屬性稱為主屬性。比如關系 工人(工號,身份證號,姓名,性別,部門). 顯然工號和身份證號都能夠唯一標示這個關系,所以都是候選碼。工號、身份證號這兩個屬性就是主屬性。如果主碼是一個屬性組,那么屬性組中的屬性都是主屬性。
- 非主屬性:不包含在任何一個候選碼中的屬性稱為非主屬性。比如在關系——學生(學號,姓名,年齡,性別,班級)中,主碼是“學號”,那么其他的“姓名”、“年齡”、“性別”、“班級”就都可以稱為非主屬性。
主鍵和外鍵有什么區(qū)別?
- 主鍵(主碼) :主鍵用于唯一標識一個元組,不能有重復,不允許為空。一個表只能有一個主鍵。
- 外鍵(外碼) :外鍵用來和其他表建立聯(lián)系用,外鍵是另一表的主鍵,外鍵是可以有重復的,可以是空值。一個表可以有多個外鍵。
為什么不推薦使用外鍵與級聯(lián)?
對于外鍵和級聯(lián),阿里巴巴開發(fā)手冊這樣說到:
【強制】不得使用外鍵與級聯(lián),一切外鍵概念必須在應用層解決。
說明: 以學生和成績的關系為例,學生表中的 student_id 是主鍵,那么成績表中的 student_id 則為外鍵。如果更新學生表中的 student_id,同時觸發(fā)成績表中的 student_id 更新,即為級聯(lián)更新。外鍵與級聯(lián)更新適用于單機低并發(fā),不適合分布式、高并發(fā)集群; 級聯(lián)更新是強阻塞,存在數(shù)據(jù)庫更新風暴的風 險; 外鍵影響數(shù)據(jù)庫的插入速度。
外鍵的缺點
- 增加了復雜性: a. 每次做DELETE 或者UPDATE都必須考慮外鍵約束,會導致開發(fā)的時候很痛苦, 測試數(shù)據(jù)極為不方便; b. 外鍵的主從關系是定的,假如哪天需求有變化,數(shù)據(jù)庫中的這個字段根本不需要和其他表有關聯(lián)的話就會增加很多麻煩。
- 增加了額外工作:數(shù)據(jù)庫需要增加維護外鍵的工作,比如當我們做一些涉及外鍵字段的增,刪,更新操作之后,需要觸發(fā)相關操作去檢查,保證數(shù)據(jù)的的一致性和正確性,這樣會不得不消耗資源;(個人覺得這個不是不用外鍵的原因,因為即使你不使用外鍵,你在應用層面也還是要保證的。所以,我覺得這個影響可以忽略不計。)
- 對分庫分表不友好 :因為分庫分表下外鍵是無法生效的。
外鍵的優(yōu)點
- 保證了數(shù)據(jù)庫數(shù)據(jù)的一致性和完整性;
- 級聯(lián)操作方便,減輕了程序代碼量;
總結
如果不涉及到分庫分表,并發(fā)量不是很高的可以考慮外鍵。
ER 圖
E-R 圖 也稱實體-聯(lián)系圖(Entity Relationship Diagram),提供了表示實體類型、屬性和聯(lián)系的方法,用來描述現(xiàn)實世界的概念模型。 它是描述現(xiàn)實世界關系概念模型的有效方法,是表示概念關系模型的一種方式。
下圖是一個學生選課的 ER 圖,每個學生可以選若干門課程,同一門課程也可以被若干人選擇,所以它們之間的關系是多對多(M: N)。另外,還有其他兩種關系是:1 對 1(1:1)、1 對多(1: N)。
我們試著將上面的 ER 圖轉換成數(shù)據(jù)庫實際的關系模型(實際設計中,我們通常會將任課教師也作為一個實體來處理)
數(shù)據(jù)庫范式
1NF(第一范式)
屬性(對應于表中的字段)不能再被分割,也就是這個字段只能是一個值,不能再分為多個其他的字段了。1NF 是所有關系型數(shù)據(jù)庫的最基本要求 ,也就是說關系型數(shù)據(jù)庫中創(chuàng)建的表一定滿足第一范式。
2NF(第二范式)
2NF 在 1NF 的基礎之上,消除了非主屬性對于碼的部分函數(shù)依賴。
舉例1:比如學生表中有學號、姓名、系名、課名、分數(shù)字段,其中(學號、課名)能唯一確定一條數(shù)據(jù),所以(學號、課名)就被稱為碼,則學號、課名分別被稱為主屬性,其它的字段便為非主屬性。此時(學號、課名)能確定唯一的學生姓名,但是學號也可以確定,這就是非主屬性(姓名)對于碼(學號、課名)的部分函數(shù)依賴。
舉例2:比如學生表中有學號、姓名、系名、課名、分數(shù)字段,我們把它拆成學號、課名、分數(shù)表(表一)和學號、姓名、系名表(表二)。
- 表一中(學號、課名)依然是碼,此時(學號、課名)能確定唯一的分數(shù),但是學號和課名不能單獨確定,所以不存在非主屬性分數(shù)對于碼 (學號、課名)的部分函數(shù)依賴,所以此表符合2NF的要求。
- 表二中學號是碼,非主屬性是姓名、系名,因為碼只有一個屬性,所以不可能存在非主屬性對于碼的部分函數(shù)依賴,也符合2NF的要求。
如下圖所示,展示了第一范式到第二范式的過渡。第二范式在第一范式的基礎上增加了一個列,這個列稱為主鍵,非主屬性都依賴于主鍵。
3NF(第三范式)
3NF 在 2NF 的基礎之上,消除了非主屬性對于碼的傳遞函數(shù)依賴。符合 3NF 要求的數(shù)據(jù)庫設計,基本上解決了數(shù)據(jù)冗余過大,插入異常,修改異常,刪除異常的問題。
舉例:比如學生表中有學號、姓名、系名、系主任字段,學號是碼,非主屬性是姓名、系名、系主任。其中系名依賴于學號,系主任依賴于系名,所以存在非主屬性(系主任)對于碼(學號)的傳遞依賴,所以該表不符合3NF的要求,可以將表拆為(學號,姓名,系名)和(系名、系主任)。
概念補充
- 函數(shù)依賴(functional dependency) :若在一張表中,在屬性(或?qū)傩越M)X 的值確定的情況下,必定能確定屬性 Y 的值,那么就可以說 Y 函數(shù)依賴于 X,寫作 X → Y。
- 部分函數(shù)依賴(partial functional dependency) :如果 X→Y,并且存在 X 的一個真子集 X0,使得 X0→Y,則稱 Y 對 X 部分函數(shù)依賴。見第二范式舉例。
- 完全函數(shù)依賴(Full functional dependency) :在一個關系中,若某個非主屬性數(shù)據(jù)項依賴于全部關鍵字稱之為完全函數(shù)依賴。
- 傳遞函數(shù)依賴 : 在關系模式 R(U)中,設 X,Y,Z 是 U 的不同的屬性子集,如果 X 確定 Y、Y 確定 Z,且有 X 不包含 Y,Y 不確定 X,(X∪Y)∩Z=空集合,則稱 Z 傳遞函數(shù)依賴(transitive functional dependency) 于 X。見第三范式舉例。傳遞函數(shù)依賴會導致數(shù)據(jù)冗余和異常。傳遞函數(shù)依賴的 Y 和 Z 子集往往同屬于某一個事物,因此可將其合并放到一個表中。
存儲過程
我們可以把存儲過程看成是一些 SQL 語句的集合,中間加了點邏輯控制語句。
存儲過程在業(yè)務比較復雜的時候是非常實用的,比如很多時候我們完成一個操作可能需要寫一大串 SQL 語句,這時候我們就可以寫一個存儲過程,這樣也方便我們下一次的調(diào)用。
存儲過程一旦調(diào)試完成通過后就能穩(wěn)定運行,另外,使用存儲過程比單純 SQL 語句執(zhí)行要快,因為存儲過程是預編譯過的。
存儲過程在互聯(lián)網(wǎng)公司應用不多,因為存儲過程難以調(diào)試和擴展,而且沒有移植性,還會消耗數(shù)據(jù)庫資源。文章來源:http://www.zghlxwxcb.cn/news/detail-484182.html
阿里巴巴 Java 開發(fā)手冊里要求禁止使用存儲過程。文章來源地址http://www.zghlxwxcb.cn/news/detail-484182.html
總結
- 了解數(shù)據(jù)庫的基本概念;
- 區(qū)分基本的元組、碼、候選碼、主碼、外碼、主屬性、非主屬性的概念;
- 注意外鍵的優(yōu)缺點及具體使用場景;
- 數(shù)據(jù)庫范式不一定都需要滿足,要具體場景具體處理;
- 存儲過程在生產(chǎn)中慎用;
到了這里,關于【MySQL】數(shù)據(jù)庫基本知識小結的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!