1. 為什么要使用數(shù)據(jù)庫
- 持久化(persistence):把數(shù)據(jù)保存到可掉電式存儲設(shè)備中以供之后使用。大多數(shù)情況下,特別是企業(yè)級應(yīng)用,數(shù)據(jù)持久化意味著將內(nèi)存中的數(shù)據(jù)保存到硬盤上加以”固化”,而持久化的實(shí)現(xiàn)過程大多通過各種關(guān)系數(shù)據(jù)庫來完成。
- 持久化的主要作用是將內(nèi)存中的數(shù)據(jù)存儲在關(guān)系型數(shù)據(jù)庫中,當(dāng)然也可以存儲在磁盤文件、XML數(shù)據(jù)文件中。
2. 數(shù)據(jù)庫與數(shù)據(jù)庫管理系統(tǒng)
2.1 數(shù)據(jù)庫的相關(guān)概念
DB:數(shù)據(jù)庫(Database) |
---|
即存儲數(shù)據(jù)的“倉庫”,其本質(zhì)是一個文件系統(tǒng)。它保存了一系列有組織的數(shù)據(jù)。 |
DBMS:數(shù)據(jù)庫管理系統(tǒng)(Database Management System) |
是一種操縱和管理數(shù)據(jù)庫的大型軟件,用于建立、使用和維護(hù)數(shù)據(jù)庫,對數(shù)據(jù)庫進(jìn)行統(tǒng)一管理和控制。用戶通過數(shù)據(jù)庫管理系統(tǒng)訪問數(shù)據(jù)庫中表內(nèi)的數(shù)據(jù)。 |
SQL:結(jié)構(gòu)化查詢語言(Structured Query Language) |
專門用來與數(shù)據(jù)庫通信的語言。 |
2.2 數(shù)據(jù)庫與數(shù)據(jù)庫管理系統(tǒng)的關(guān)系
數(shù)據(jù)庫管理系統(tǒng)(DBMS)可以管理多個數(shù)據(jù)庫,一般開發(fā)人員會針對每一個應(yīng)用創(chuàng)建一個數(shù)據(jù)庫。為保存應(yīng)用中實(shí)體的數(shù)據(jù),一般會在數(shù)據(jù)庫創(chuàng)建多個表,以保存程序中實(shí)體用戶的數(shù)據(jù)。
數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫和表的關(guān)系如圖所示:
2.3 常見的數(shù)據(jù)庫管理系統(tǒng)排名(DBMS)
目前互聯(lián)網(wǎng)上常見的數(shù)據(jù)庫管理軟件有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix這幾種。以下是2023年DB-Engines Ranking 對各數(shù)據(jù)庫受歡迎程度進(jìn)行調(diào)查后的統(tǒng)計結(jié)果:(查看數(shù)據(jù)庫最新排名:https://db-engines.com/en/ranking)
對應(yīng)的走勢圖:(https://db-engines.com/en/ranking_trend)
2.4 常見的數(shù)據(jù)庫介紹
Oracle
1979 年,Oracle 2 誕生,它是第一個商用的 RDBMS(關(guān)系型數(shù)據(jù)庫管理系統(tǒng))。隨著 Oracle 軟件的名氣越來越大,公司也改名叫 Oracle 公司。
2007年,總計85億美金收購BEA Systems。
2009年,總計74億美金收購SUN。此前的2008年,SUN以10億美金收購MySQL。意味著Oracle 同時擁有了 MySQL 的管理權(quán),至此 Oracle 在數(shù)據(jù)庫領(lǐng)域中成為絕對的領(lǐng)導(dǎo)者。
2013年,甲骨文超越IBM,成為繼Microsoft后全球第二大軟件公司。
如今 Oracle 的年收入達(dá)到了 400 億美金,足以證明商用(收費(fèi))數(shù)據(jù)庫軟件的價值。
SQL Server
SQL Server 是微軟開發(fā)的大型商業(yè)數(shù)據(jù)庫,誕生于 1989 年。C#、.net等語言常使用,與WinNT完全集成,也可以很好地與Microsoft BackOffice產(chǎn)品集成。
DB2
IBM公司的數(shù)據(jù)庫產(chǎn)品,收費(fèi)的。常應(yīng)用在銀行系統(tǒng)中。
PostgreSQL
PostgreSQL 的穩(wěn)定性極強(qiáng),最符合SQL標(biāo)準(zhǔn),開放源碼,具備商業(yè)級DBMS質(zhì)量。PG對數(shù)據(jù)量大的文本以及SQL處理較快。
SyBase
已經(jīng)淡出歷史舞臺。提供了一個非常專業(yè)數(shù)據(jù)建模的工具PowerDesigner。
SQLite
嵌入式的小型數(shù)據(jù)庫,應(yīng)用在手機(jī)端。 零配置,SQlite3不用安裝,不用配置,不用啟動,關(guān)閉或者配置數(shù)據(jù)庫實(shí)例。當(dāng)系統(tǒng)崩潰后不用做任何恢復(fù)操作,再下次使用數(shù)據(jù)庫的時候自動恢復(fù)。
informix
IBM公司出品,取自Information 和Unix的結(jié)合,它是第一個被移植到Linux上的商業(yè)數(shù)據(jù)庫產(chǎn)品。僅運(yùn)行于unix/linux平臺,命令行操作。 性能較高,支持集群,適應(yīng)于安全性要求極高的系統(tǒng),尤其是銀行,證券系統(tǒng)的應(yīng)用。
3. MySQL介紹
3.1 概述
- MySQL是一個
開放源代碼的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)
,由瑞典MySQL AB(創(chuàng)始人Michael Widenius)公司1995年開發(fā),迅速成為開源數(shù)據(jù)庫的 No.1。 - 2008被
Sun
收購(10億美金),2009年Sun被Oracle
收購。MariaDB
應(yīng)運(yùn)而生。(MySQL 的創(chuàng)造者擔(dān)心 MySQL 有閉源的風(fēng)險,因此創(chuàng)建了 MySQL 的分支項(xiàng)目 MariaDB) - MySQL6.x 版本之后分為
社區(qū)版
和商業(yè)版
。 - MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
- MySQL是開源的,所以你不需要支付額外的費(fèi)用。
- MySQL是可以定制的,采用了
GPL(GNU General Public License)
協(xié)議,你可以修改源碼來開發(fā)自己的MySQL系統(tǒng)。 - MySQL支持大型的數(shù)據(jù)庫??梢蕴幚頁碛猩锨f條記錄的大型數(shù)據(jù)庫。
- MySQL支持大型數(shù)據(jù)庫,支持5000萬條記錄的數(shù)據(jù)倉庫,32位系統(tǒng)表文件最大可支持
4GB
,64位系統(tǒng)支持最大的表文件為8TB
。 - MySQL使用
標(biāo)準(zhǔn)的SQL數(shù)據(jù)語言
形式。 - MySQL可以允許運(yùn)行于多個系統(tǒng)上,并且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP和Ruby等。
3.2 MySQL發(fā)展史重大事件
MySQL的歷史就是整個互聯(lián)網(wǎng)的發(fā)展史?;ヂ?lián)網(wǎng)業(yè)務(wù)從社交領(lǐng)域、電商領(lǐng)域到金融領(lǐng)域的發(fā)展,推動著應(yīng)用對數(shù)據(jù)庫的需求提升,對傳統(tǒng)的數(shù)據(jù)庫服務(wù)能力提出了挑戰(zhàn)。高并發(fā)、高性能、高可用、輕資源、易維護(hù)、易擴(kuò)展的需求,促進(jìn)了MySQL的長足發(fā)展。
1.4 關(guān)于MySQL 8.0
MySQL從5.7版本直接跳躍發(fā)布了8.0版本
,可見這是一個令人興奮的里程碑版本。MySQL 8版本在功能上做了顯著的改進(jìn)與增強(qiáng),開發(fā)者對MySQL的源代碼進(jìn)行了重構(gòu),最突出的一點(diǎn)是多MySQL Optimizer優(yōu)化器進(jìn)行了改進(jìn)。不僅在速度上得到了改善,還為用戶帶來了更好的性能和更棒的體驗(yàn)。
1.5 Why choose MySQL?
為什么如此多的廠商要選用MySQL?大概總結(jié)的原因主要有以下幾點(diǎn):
-
開放源代碼,使用成本低。
-
性能卓越,服務(wù)穩(wěn)定。
-
軟件體積小,使用簡單,并且易于維護(hù)。
-
歷史悠久,社區(qū)用戶非?;钴S,遇到問題可以尋求幫助。
-
許多互聯(lián)網(wǎng)公司在用,經(jīng)過了時間的驗(yàn)證。
1.6 Oracle vs MySQL
Oracle 更適合大型跨國企業(yè)的使用,因?yàn)樗麄儗M(fèi)用不敏感,但是對性能要求以及安全性有更高的要求。
MySQL 由于其體積小、速度快、總體擁有成本低,可處理上千萬條記錄的大型數(shù)據(jù)庫,尤其是開放源碼這一特點(diǎn),使得很多互聯(lián)網(wǎng)公司、中小型網(wǎng)站選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫(Facebook,Twitter,YouTube,阿里巴巴/螞蟻金服,去哪兒,美團(tuán)外賣,騰訊)。
4. RDBMS 與 非RDBMS
從排名中我們能看出來,關(guān)系型數(shù)據(jù)庫絕對是 DBMS 的主流,其中使用最多的 DBMS 分別是 Oracle、MySQL 和 SQL Server。這些都是關(guān)系型數(shù)據(jù)庫(RDBMS)。
4.1 關(guān)系型數(shù)據(jù)庫(RDBMS)
4.1.1 實(shí)質(zhì)
-
這種類型的數(shù)據(jù)庫是
最古老
的數(shù)據(jù)庫類型,關(guān)系型數(shù)據(jù)庫模型是把復(fù)雜的數(shù)據(jù)結(jié)構(gòu)歸結(jié)為簡單的二元關(guān)系
(即二維表格形式)。 -
關(guān)系型數(shù)據(jù)庫以
行(row)
和列(column)
的形式存儲數(shù)據(jù),以便于用戶理解。這一系列的行和列被稱為表(table)
,一組表組成了一個庫(database)。 -
表與表之間的數(shù)據(jù)記錄有關(guān)系(relationship)?,F(xiàn)實(shí)世界中的各種實(shí)體以及實(shí)體之間的各種聯(lián)系均用
關(guān)系模型
來表示。關(guān)系型數(shù)據(jù)庫,就是建立在關(guān)系模型
基礎(chǔ)上的數(shù)據(jù)庫。 -
SQL 就是關(guān)系型數(shù)據(jù)庫的查詢語言。
4.1.2 優(yōu)勢
-
復(fù)雜查詢
可以用SQL語句方便的在一個表以及多個表之間做非常復(fù)雜的數(shù)據(jù)查詢。 -
事務(wù)支持
使得對于安全性能很高的數(shù)據(jù)訪問要求得以實(shí)現(xiàn)。
4.2 非關(guān)系型數(shù)據(jù)庫(非RDBMS)
4.2.1 介紹
非關(guān)系型數(shù)據(jù)庫,可看成傳統(tǒng)關(guān)系型數(shù)據(jù)庫的功能閹割版本
,基于鍵值對存儲數(shù)據(jù),不需要經(jīng)過SQL層的解析,性能非常高
。同時,通過減少不常用的功能,進(jìn)一步提高性能。
目前基本上大部分主流的非關(guān)系型數(shù)據(jù)庫都是免費(fèi)的。
4.2.2 有哪些非關(guān)系型數(shù)據(jù)庫
相比于 SQL,NoSQL 泛指非關(guān)系型數(shù)據(jù)庫,包括了榜單上的鍵值型數(shù)據(jù)庫、文檔型數(shù)據(jù)庫、搜索引擎和列存儲等,除此以外還包括圖形數(shù)據(jù)庫。也只有用 NoSQL 一詞才能將這些技術(shù)囊括進(jìn)來。
鍵值型數(shù)據(jù)庫
鍵值型數(shù)據(jù)庫通過 Key-Value 鍵值的方式來存儲數(shù)據(jù),其中 Key 和 Value 可以是簡單的對象,也可以是復(fù)雜的對象。Key 作為唯一的標(biāo)識符,優(yōu)點(diǎn)是查找速度快,在這方面明顯優(yōu)于關(guān)系型數(shù)據(jù)庫,缺點(diǎn)是無法像關(guān)系型數(shù)據(jù)庫一樣使用條件過濾(比如 WHERE),如果你不知道去哪里找數(shù)據(jù),就要遍歷所有的鍵,這就會消耗大量的計算。
鍵值型數(shù)據(jù)庫典型的使用場景是作為內(nèi)存緩存
。Redis
是最流行的鍵值型數(shù)據(jù)庫。
文檔型數(shù)據(jù)庫
此類數(shù)據(jù)庫可存放并獲取文檔,可以是XML、JSON等格式。在數(shù)據(jù)庫中文檔作為處理信息的基本單位,一個文檔就相當(dāng)于一條記錄。文檔數(shù)據(jù)庫所存放的文檔,就相當(dāng)于鍵值數(shù)據(jù)庫所存放的“值”。MongoDB 是最流行的文檔型數(shù)據(jù)庫。此外,還有CouchDB等。
搜索引擎數(shù)據(jù)庫
雖然關(guān)系型數(shù)據(jù)庫采用了索引提升檢索效率,但是針對全文索引效率卻較低。搜索引擎數(shù)據(jù)庫是應(yīng)用在搜索引擎領(lǐng)域的數(shù)據(jù)存儲形式,由于搜索引擎會爬取大量的數(shù)據(jù),并以特定的格式進(jìn)行存儲,這樣在檢索的時候才能保證性能最優(yōu)。核心原理是“倒排索引”。
典型產(chǎn)品:Solr、Elasticsearch、Splunk 等。
列式數(shù)據(jù)庫
列式數(shù)據(jù)庫是相對于行式存儲的數(shù)據(jù)庫,Oracle、MySQL、SQL Server 等數(shù)據(jù)庫都是采用的行式存儲(Row-based),而列式數(shù)據(jù)庫是將數(shù)據(jù)按照列存儲到數(shù)據(jù)庫中,這樣做的好處是可以大量降低系統(tǒng)的 I/O,適合于分布式文件系統(tǒng),不足在于功能相對有限。典型產(chǎn)品:HBase等。
圖形數(shù)據(jù)庫
圖形數(shù)據(jù)庫,利用了圖這種數(shù)據(jù)結(jié)構(gòu)存儲了實(shí)體(對象)之間的關(guān)系。圖形數(shù)據(jù)庫最典型的例子就是社交網(wǎng)絡(luò)中人與人的關(guān)系,數(shù)據(jù)模型主要是以節(jié)點(diǎn)和邊(關(guān)系)來實(shí)現(xiàn),特點(diǎn)在于能高效地解決復(fù)雜的關(guān)系問題。
圖形數(shù)據(jù)庫顧名思義,就是一種存儲圖形關(guān)系的數(shù)據(jù)庫。它利用了圖這種數(shù)據(jù)結(jié)構(gòu)存儲了實(shí)體(對象)之間的關(guān)系。關(guān)系型數(shù)據(jù)用于存儲明確關(guān)系的數(shù)據(jù),但對于復(fù)雜關(guān)系的數(shù)據(jù)存儲卻有些力不從心。如社交網(wǎng)絡(luò)中人物之間的關(guān)系,如果用關(guān)系型數(shù)據(jù)庫則非常復(fù)雜,用圖形數(shù)據(jù)庫將非常簡單。典型產(chǎn)品:Neo4J、InfoGrid等。
4.2.3 NoSQL的演變
由于 SQL 一直稱霸 DBMS,因此許多人在思考是否有一種數(shù)據(jù)庫技術(shù)能遠(yuǎn)離 SQL,于是 NoSQL 誕生了,但是隨著發(fā)展卻發(fā)現(xiàn)越來越離不開 SQL。到目前為止 NoSQL 陣營中的 DBMS 都會有實(shí)現(xiàn)類似 SQL 的功能。下面是“NoSQL”這個名詞在不同時期的詮釋,從這些釋義的變化中可以看出 NoSQL 功能的演變
:
1970:NoSQL = We have no SQL
1980:NoSQL = Know SQL
2000:NoSQL = No SQL!
2005:NoSQL = Not only SQL
2013:NoSQL = No, SQL!
NoSQL 對 SQL 做出了很好的補(bǔ)充,比如實(shí)際開發(fā)中,有很多業(yè)務(wù)需求,其實(shí)并不需要完整的關(guān)系型數(shù)據(jù)庫功能,非關(guān)系型數(shù)據(jù)庫的功能就足夠使用了。這種情況下,使用性能更高
、成本更低
的非關(guān)系型數(shù)據(jù)庫當(dāng)然是更明智的選擇。比如:日志收集、排行榜、定時器等。
4.3 小結(jié)
NoSQL 的分類很多,即便如此,在 DBMS 排名中,還是 SQL 陣營的比重更大,影響力前 5 的 DBMS 中有 4 個是關(guān)系型數(shù)據(jù)庫,而排名前 20 的 DBMS 中也有 12 個是關(guān)系型數(shù)據(jù)庫。所以說,掌握 SQL 是非常有必要的。整套課程將圍繞 SQL 展開。
5. 關(guān)系型數(shù)據(jù)庫設(shè)計規(guī)則
-
關(guān)系型數(shù)據(jù)庫的典型數(shù)據(jù)結(jié)構(gòu)就是
數(shù)據(jù)表
,這些數(shù)據(jù)表的組成都是結(jié)構(gòu)化的(Structured)。 -
將數(shù)據(jù)放到表中,表再放到庫中。
-
一個數(shù)據(jù)庫中可以有多個表,每個表都有一個名字,用來標(biāo)識自己。表名具有唯一性。
-
表具有一些特性,這些特性定義了數(shù)據(jù)在表中如何存儲,類似Java和Python中 “類”的設(shè)計。
5.1 表、記錄、字段
-
E-R(entity-relationship,實(shí)體-聯(lián)系)模型中有三個主要概念是:
實(shí)體集
、屬性
、聯(lián)系集
。 -
一個實(shí)體集(class)對應(yīng)于數(shù)據(jù)庫中的一個表(table),一個實(shí)體(instance)則對應(yīng)于數(shù)據(jù)庫表中的一行(row),也稱為一條記錄(record)。一個屬性(attribute)對應(yīng)于數(shù)據(jù)庫表中的一列(column),也稱為一個字段(field)。
ORM思想 (Object Relational Mapping)體現(xiàn):
數(shù)據(jù)庫中的一個表 <—> Java或Python中的一個類
表中的一條數(shù)據(jù) <—> 類中的一個對象(或?qū)嶓w)
表中的一個列 <----> 類中的一個字段、屬性(field)
5.2 表的關(guān)聯(lián)關(guān)系
-
表與表之間的數(shù)據(jù)記錄有關(guān)系(relationship)?,F(xiàn)實(shí)世界中的各種實(shí)體以及實(shí)體之間的各種聯(lián)系均用關(guān)系模型來表示。
-
四種:一對一關(guān)聯(lián)、一對多關(guān)聯(lián)、多對多關(guān)聯(lián)、自我引用
5.2.1 一對一關(guān)聯(lián)(one-to-one)
- 在實(shí)際的開發(fā)中應(yīng)用不多,因?yàn)橐粚σ豢梢詣?chuàng)建成一張表。
- 舉例:設(shè)計
學(xué)生表
:學(xué)號、姓名、手機(jī)號碼、班級、系別、身份證號碼、家庭住址、籍貫、緊急聯(lián)系人、…-
拆為兩個表:兩個表的記錄是一一對應(yīng)關(guān)系。
-
基礎(chǔ)信息表
(常用信息):學(xué)號、姓名、手機(jī)號碼、班級、系別 -
檔案信息表
(不常用信息):學(xué)號、身份證號碼、家庭住址、籍貫、緊急聯(lián)系人、…
-
- 兩種建表原則:
- 外鍵唯一:主表的主鍵和從表的外鍵(唯一),形成主外鍵關(guān)系,外鍵唯一。
- 外鍵是主鍵:主表的主鍵和從表的主鍵,形成主外鍵關(guān)系。
5.2.2 一對多關(guān)系(one-to-many)
- 常見實(shí)例場景:
客戶表和訂單表
,分類表和商品表
,部門表和員工表
。 - 舉例:
-
員工表:編號、姓名、…、所屬部門
-
部門表:編號、名稱、簡介
-
- 一對多建表原則:在從表(多方)創(chuàng)建一個字段,字段作為外鍵指向主表(一方)的主鍵
5.2.3 多對多(many-to-many)
要表示多對多關(guān)系,必須創(chuàng)建第三個表,該表通常稱為聯(lián)接表
,它將多對多關(guān)系劃分為兩個一對多關(guān)系。將這兩個表的主鍵都插入到第三個表中。
-
舉例1:學(xué)生-課程
-
學(xué)生信息表
:一行代表一個學(xué)生的信息(學(xué)號、姓名、手機(jī)號碼、班級、系別…) -
課程信息表
:一行代表一個課程的信息(課程編號、授課老師、簡介…) -
選課信息表
:一個學(xué)生可以選多門課,一門課可以被多個學(xué)生選擇
學(xué)號 課程編號
1 1001
2 1001
1 1002
- 舉例2:產(chǎn)品-訂單
“訂單”表和“產(chǎn)品”表有一種多對多的關(guān)系,這種關(guān)系是通過與“訂單明細(xì)”表建立兩個一對多關(guān)系來定義的。一個訂單可以有多個產(chǎn)品,每個產(chǎn)品可以出現(xiàn)在多個訂單中。
-
產(chǎn)品表
:“產(chǎn)品”表中的每條記錄表示一個產(chǎn)品。 -
訂單表
:“訂單”表中的每條記錄表示一個訂單。 -
訂單明細(xì)表
:每個產(chǎn)品可以與“訂單”表中的多條記錄對應(yīng),即出現(xiàn)在多個訂單中。一個訂單可以與“產(chǎn)品”表中的多條記錄對應(yīng),即包含多個產(chǎn)品。
- 舉例3:用戶-角色
- 多對多關(guān)系建表原則:需要創(chuàng)建第三張表,中間表中至少兩個字段,這兩個字段分別作為外鍵指向各自一方的主鍵。
文章來源:http://www.zghlxwxcb.cn/news/detail-436962.html
5.3.4 自我引用(Self reference)
文章來源地址http://www.zghlxwxcb.cn/news/detail-436962.html
到了這里,關(guān)于MySQL基礎(chǔ)(一)數(shù)據(jù)庫概述的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!