10分鐘了解Web開發(fā)中的數(shù)據(jù)庫基本概念
時間:2023-05-24 03:33:01 | 來源:網(wǎng)站運營
時間:2023-05-24 03:33:01 來源:網(wǎng)站運營
10分鐘了解Web開發(fā)中的數(shù)據(jù)庫基本概念:
由David發(fā)表在天碼營
數(shù)據(jù)持久化
掌握了Servlet/JSP技術,我們已經(jīng)可以創(chuàng)建動態(tài)的Web應用了。除了動態(tài)的Web界面,一個有價值的Web應用必然需要進行數(shù)據(jù)存儲,開發(fā)上我們一般稱之為數(shù)據(jù)持久化(Data Persistence)。從業(yè)務功能的角度出發(fā),簡單的應用可以認為就是數(shù)據(jù)的增刪改查。比如一個產(chǎn)品級的博客應用,最核心的功能就是對博客內(nèi)容的創(chuàng)建、修改、刪除和查詢,而這些功能都離不開Web服務器背后的數(shù)據(jù)庫系統(tǒng)。
狹義地理解, “持久化”就是指把業(yè)務數(shù)據(jù)永久存儲到數(shù)據(jù)庫中;廣義的理解,“持久化”則包括和數(shù)據(jù)庫相關的各種操作。將內(nèi)存中的數(shù)據(jù)存入數(shù)據(jù)庫就能夠隨時獲取或者更新這些數(shù)據(jù)。所以讓我們首先來了解一下數(shù)據(jù)庫系統(tǒng)。
數(shù)據(jù)庫簡介
數(shù)據(jù)庫技術誕生于上個世紀60年代,是計算機科學的一個重要分支。當時計算機開始廣泛地應用于數(shù)據(jù)管理,對數(shù)據(jù)的共享提出了越來越高的要求。傳統(tǒng)的文件系統(tǒng)已經(jīng)不能滿足人們的需要。能夠統(tǒng)一管理和共享數(shù)據(jù)的數(shù)據(jù)庫管理系統(tǒng)(DBMS, Database Management System)應運而生。
DBMS的主要包括兩個功能:
- 數(shù)據(jù)定義功能:提供數(shù)據(jù)定義語言(DDL,Data Definition Language),用以定義數(shù)據(jù)庫中的數(shù)據(jù)對象
- 數(shù)據(jù)操縱功能:提供數(shù)據(jù)操縱語言(DML,Data Manipulation Language),用以實現(xiàn)對數(shù)據(jù)的基本操作(查詢、插入、刪除和修改)
- 數(shù)據(jù)庫的運行管理和維護等,如數(shù)據(jù)的安全、完整性、并發(fā)和恢復等控制
自數(shù)據(jù)庫從誕生以來,大致經(jīng)歷了以下幾個階段:
- 層次數(shù)據(jù)庫與網(wǎng)狀數(shù)據(jù)庫
- 關系數(shù)據(jù)庫
- 非關系型數(shù)據(jù)庫
目前,非關系型數(shù)據(jù)庫正在蓬勃的發(fā)展中,比如MongoDB、Redis、BigTable等非關系型數(shù)據(jù)庫已經(jīng)被很多領域廣泛的應用。
關系型數(shù)據(jù)庫依然是Web開發(fā)中的主流數(shù)據(jù)庫。我們將以使用最廣泛的開源關系型數(shù)據(jù)庫MySQL作為我們博客應用的數(shù)據(jù)庫。
關系型數(shù)據(jù)庫,是指使用關系模型來組織數(shù)據(jù),使用集合代數(shù)等數(shù)學概念和方法來處理數(shù)據(jù)的一種數(shù)據(jù)庫。在關系型數(shù)據(jù)庫中,現(xiàn)實世界中的各種實體以及實體之間的各種聯(lián)系均用關系模型來表示。不過我們這里先不深入其數(shù)學原理,我們以更形象的方式來理解關系型數(shù)據(jù)庫的幾個基本概念。
數(shù)據(jù)庫表
關系可以認為就是一個二維表格,關系型數(shù)據(jù)庫就是一組二維表格的集合,通過表格來描述和存數(shù)對象和對象之間的關系。
我們已經(jīng)實現(xiàn)了博客頁面,我們來分析一下這個頁面:
從中我們看到,一篇博客至少具有以下信息:
- 博客標題
- 創(chuàng)建時間
- 博客內(nèi)容
- 作者頭像
- 作者名稱
這些信息存儲到數(shù)據(jù)庫中,就這樣一個blog表:
表中的每一列就是表的一個字段,對應Blog對象的一個屬性;表中的每一張就是一條記錄,對應于一篇具體的博客。
主鍵
數(shù)據(jù)存儲起來之后我們需要非常方便得查詢。接下來我們想一個問題:如何快速地識別出一條博客記錄?一種方法是根據(jù)title來標識一條記錄。如果Ricky也寫了一篇名為“天碼營是什么?”的博客呢?這時候title就不是唯一標識了。
這時我們可以給blog表,增加一個id字段,通過唯一的整數(shù)值來標識一條記錄。能夠唯一確定一條記錄的字段就稱為主鍵。
注意多個字段可以一起作為一個表的主鍵,但是在開發(fā)中一般情況下我們使用自增的整數(shù)字段來作為主鍵。即每增加一條記錄,記錄的id的值就自動增加,這樣就保證了每條記錄的唯一性。`
字段的數(shù)據(jù)類型
表中的每個字段,與一個類的屬性一樣,具有數(shù)據(jù)類型。數(shù)據(jù)中有三種主要的數(shù)據(jù)類型:文本、數(shù)字和日期/時間類型。不同的數(shù)據(jù)類型擁有不同的特性,例如數(shù)字類型可以做一些數(shù)學操作,時間類型可以按照一定規(guī)則進行排序或篩選。同時,不同的數(shù)據(jù)類型在存儲時是不一樣,這就導致了不同的數(shù)據(jù)類型效率上有很大的差別。在后面的學習中,我們將會在數(shù)據(jù)庫表的設計過程中講解具體的數(shù)據(jù)類型,以及選擇數(shù)據(jù)類型的最佳實踐。
數(shù)據(jù)庫表關系
一對多關系
觀察Blog表中的數(shù)據(jù),我們發(fā)現(xiàn)雖然只有David和Ricky兩名作者,但是卻出現(xiàn)了5次作者姓名和作者頭像的信息,這樣不僅浪費存儲空間,帶來潛在的不一致性等問題。
這樣的表結構設計具有明顯的不合理性。與類的設計需要符合面向?qū)ο蟮脑O計原則一樣,表的設計也需要遵循一些范式來保證良好的表結構。
這里我們可以把作者的信息提取出來放到一個單獨的user表中:
相應地需要修改blog表的結構:
我們發(fā)現(xiàn)blog表中多了一個author字段,保存的是User的id。這時就形成了一個外鍵約束<blog.author, user.id>。
我們說一個表具有外鍵,就是說表中一個字段或者幾個字段的組合在另外一個表中是主鍵?;氐綀鼍爸屑矗篴uthor有一個外鍵約束,外鍵是user表的主鍵id。
設置外鍵后,當往blog表中中插入數(shù)據(jù)時,數(shù)據(jù)庫會自動檢查插入數(shù)據(jù)的author字段,是否存在user表中存在對應的記錄。如果不存在,數(shù)據(jù)庫會拋出錯誤,拒絕插入,這樣就可以保證數(shù)據(jù)的一致性和完整性。分為這樣兩個表同時也讓分別維護博客信息和用戶信息更為方便,處理邏輯得意分離。
user表和blog表是一種一對多的關系,其含義也很容易理解,一個用戶可以創(chuàng)建多篇博客。其它兩種關系我們在后面的內(nèi)容中再行介紹?;谕怄I我們可以建立表與表之間的另外兩種關系:一對一和多對多。
一對一關系
我們可以把Blog的內(nèi)容單獨拿出來放在一張表中,命名為blog_content。那么blog_content和blog就是一對一的關系,一篇博客有其唯一的內(nèi)容,一條內(nèi)容也只會屬于某一篇博客。
一對一關系相對不是很常見,但是依然有其應用場景。比如一篇博客信息中,占用空間的主要就是博客內(nèi)容。將其獨立出去,blog表的數(shù)據(jù)量就大大減小,在數(shù)據(jù)記錄非常多時且如果需要頻繁修改和訪問blog表中的信息時,,可以極大的增加我們的讀寫效率。因為數(shù)據(jù)庫表的存儲的數(shù)據(jù)越少,讀寫效率越高。
多對多關系
對后一種關系是多對多關系。假設我們希望給每篇博客設置標簽,則一個標簽可以對應多篇博客,一篇博客可以對應多個標簽。標簽數(shù)據(jù)可以通過定義個tag表來保存。而標簽和博客的多對多關系,需要再單獨定義一個表來描述,命名為blog_tag,這三個表如下所示:
上圖中可見,具有“Java”標簽的文章有《JSP簡介》和《Servlet簡介》,對應blog_tag表的兩條記錄<1,2>,<1,3>;博客《天碼營是什么》具有標簽“互聯(lián)網(wǎng)”和“天碼營”對應1blog_tag1表的兩條記錄<2,1>,<5,1>。
總結
這節(jié)課我們學習了數(shù)據(jù)庫的一些基礎概念,我們可以大致的了解如何針對一個需求來進行數(shù)據(jù)庫的設計,我們已經(jīng)有了一個感性的認識。具體如何操作來去創(chuàng)建一張數(shù)據(jù)庫表以及創(chuàng)建他們之間的關系呢?接下來,我們先安裝好MySQL數(shù)據(jù)庫,然后學習如何通過結構化查詢語言(SQL)來操作數(shù)據(jù)庫。
更多文章請訪問天碼營網(wǎng)站