官术网_书友最值得收藏!

2.2 數據庫相關知識

后端產品的很多功能都是圍繞數據的存儲、流轉和運算等操作進行的。因此,對于后端產品經理而言,了解數據和數據庫知識是非常有必要的。

2.2.1 數據

1.數據的概念

數據,就是能夠被智能設備(計算機、智能手機等)識別、存儲和加工處理的信息的載體。在計算機系統中,各種文本、數字、語音、圖形、圖像等,統稱為數據。數據經過加工后就成為信息。數據是計算機世界的運算對象,也是輸出產物。

2.數據類型

數據類型,就是一組性質相同的值的集合,以及定義在這個值集合上的一組操作的總稱。我們也可以這樣理解:數據類型就是對具體數據或變量的約束和歸類。每一種數據都有唯一的一個數據類型(需注意,變量也可以被指定為缺省類型)。

數據類型的出現,一方面是為了把數據分成所需內存大小不同的種類(這樣在編程的時候,只有在使用大的數據時才申請大內存,可以充分利用內存),另一方面是確定數據的屬性(比如一個或一串字母可能代表不同的含義,需要對之加以定義,才可方便運用)。

不同編程語言規定的數據類型不同,常見的數據類型有整型、字符串型、浮點型、布爾型等。

(1)整型

整型變量表示的是整數類型的數據,其類型說明符一般為int。其常被分為長整型、短整型等。整形變量屬于數字,因此是可以進行數學運算的,如下所示。

在該例子中,z等于3。

(2)字符串型

字符串型可以理解為文本型。該類型的值不能直接做數學運算,只能用于展示。字符串之間可以拼接。在Java語言中使用string表示字符串類型,在C語言中則使用char表示。字符串可以是任意內容,比如“12”。

(3)浮點型

浮點型就是小數類型的數據,一般用float或double表示浮點型。比如,1.2是浮點型數字,23e2是科學計數法形式的浮點型數字。

(4)布爾型

布爾型可以簡單地理解為判斷真假的類型,一般用bool或boolean表示。布爾型的值只有兩個:false(假)和true(真)。

需要注意的是,在寫與數據相關的需求文檔的時候,產品經理可以對數據庫中的數據類型進行定義。如表2-3所示,在該需求文檔中對數據的定義就包括“字段類型”這一列。

表2-3 需求文檔中對數據的定義

不過,如果產品經理在寫需求文檔時不確定相關數據的類型,或者不懂如何區分數據類型,那就最好不要明確定義,以免出錯。在這種情況下,我們可以以備注的形式加以說明,比如備注“該字段為整數,范圍為[-100,10000]”,程序員也就明白了。

2.2.2 數據結構

1.數據結構概念

數據結構,顧名思義,就是數據之間的結構關系。數據結構是對數據存儲和組織方式的規范,是對現實中事件的運行結構或運行方式的模型化。在通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。比如,數據庫的存入和讀取就依賴數據結構。

2.數據結構的構成

數據結構包括三個方面的內容:數據邏輯結構、數據存儲結構、數據運算,如圖2-7所示。

圖2-7 數據結構的三方面內容

(1)數據邏輯結構

數據邏輯結構,反映的是數據元素之間的邏輯關系,與數據在計算機中的存儲位置無關。

數據邏輯結構,一般分為集合結構、線性結構、樹狀結構和圖狀結構四類。集合結構中的任何兩個數據元素之間都沒有邏輯關系,組織形式松散;線性結構中的結點按邏輯關系依次排列形成一個“鎖鏈”,線性結構還可以劃分為表、數組、隊列、棧、串等結構;樹形結構具有分支、層次特性,其形態有點類似于自然界中的樹;圖狀結構中的結點按邏輯關系互相纏繞,任何兩個結點都可以彼此鄰接。

(2)數據存儲結構

當我們處理數據之后,就需要存儲數據,這涉及數據存儲結構,即物理結構。數據存儲結構有順序、鏈接、索引、散列等多種。

(3)數據運算

數據運算就是基于數據結構進行的運算,其具體實現依賴于數據的存儲結構。數據運算可以簡單理解為,對已經存儲好的數據進行增加、查找、編輯、刪除等操作。數據運算是數據結構的一個重要方面。

(4)三者之間的關系

一種數據邏輯結構在計算機里可以用不同的數據存儲結構實現,數據運算是基于數據邏輯結構和存儲結構實現的,三者相輔相成。

3.常見的數據結構舉例

(1)數組

所謂數組,就是有序的元素序列,即有限數量的類型相同的變量的集合。按數組元素的類型不同,數組又可分為數值數組、字符數組、指針數組等。

比如 char CHB[]={"1","2","3"}的結構,就是數組的表示方式,其含義就是定義CHB為字符串的一維數組,包含的值是字符串形式的“1”“2”“3”。這樣就通過一個簡單的組合形式,表達了一組有共性的數據。

二維數組是一種簡單的數據結構,如圖2-8所示。

圖2-8 二維數組示例

這個二維數組的結構與一張有行有列的表很像:每一行代表一個對象,每一列代表對象的一個屬性。盡管二維數組很適合存儲表數據,但是當你需要根據某個條件從數組中查詢數據時,就要遍歷每一行數據,而當數據量大的時候,這將花費許多時間,服務器性能就會變差。這時候就需要考慮使用其他數據結構。

(2)樹結構

樹結構是另一種重要的非線性數據結構。直觀地看,它是數據元素(在樹中被稱為結點)按分支關系組織起來的結構。一切具有層次關系的問題都可用樹結構來描述,比如家庭成員關系、頁面各級菜單關系等。

數據庫索引是樹結構的一個重要應用,索引可以提高數據庫查詢速度。常見的關系型數據庫的索引使用的數據結構,多是 B+Tree 或者 B-Tree(二者都是樹結構的一種),例如MySQL的索引使用的是B+Tree,Oracle和Sysbase的索引使用的是B-Tree。

我們來了解一下為什么索引要使用樹結構的存儲方式來實現。

我們都知道,數據庫文件是存儲在硬盤上的,每次讀取數據庫都需要在硬盤上搜索,而 B+Tree 數據結構的查詢方式不是遍歷,而是從樹根部對比著向下遞推做二分查找,查詢次數不會高于樹的層數,所以查詢速度更快。

如圖2-9所示,該樹結構有15個節點。

圖2-9 樹結構示意圖

如果在該樹結構中查找“208”節點,那么該數據的查找過程是按照如下方式進行的。

①從根節點(也就是“136”節點)開始查找。

②判斷出 136<208,所以在“136”節點的右子樹中查找,找到“398”節點。

③判斷出398>208,所以在“398”節點的左子樹中繼續查找,找到“250”節點。

④判斷出250>208,所以在“250”節點的左子樹中繼續查找,找到“200”節點。

⑤判斷出200<208,所以在“200”節點的右子樹中繼續查找,然而“200”節點沒有右子樹,因此不可能找到“208”節點(如果其存在的話,一定在“200”節點的右子樹上)。

結論就是:查找完畢,不存在“208”節點。

那么,如何從圖2-9中查找“40”節點呢?查找過程如下。

①從根節點“136”節點開始查找。

②判斷出136>40,所以在“136”節點的左子樹中查找,找到“80”節點。

③判斷出80>40,所以在“80”節點的左子樹中查找,找到“40”節點。

④判斷出40=40,所以該節點找到了!

提取“40”節點中存儲對象的對應數組行號索引。有了這個行號索引,想獲得這行數據就能立即拿到(具體實現的方式此處不做討論)。

需要注意的是,樹結構還有很多變種,比如“堆”結構就是一種特殊的樹形數據結構。

(3)棧

棧也是一種重要的數據結構。它最大的特點是只能在某一端插入和刪除。它按照先進后出的原則存儲數據,先進入的數據被壓入棧底,最后進入的數據在棧頂,需要讀數據的時候從棧頂開始讀數據(即最后一個數據被第一個讀出來),出棧的順序與入棧的順序相反。這就像是一摞蒸籠,一層一層放入小籠包,而當把小籠包拿出來的時候只能從上往下進行。因此凡是遇到有這樣邏輯需求的數據,就可以套用該數據類型。棧結構如圖2-10所示。

圖2-10 棧結構示意圖

(4)隊列

隊列也是一種特殊的線性表。隊列與棧相反,是按照“先進先出”和“后進后出”的原則組織數據的。當隊列中沒有元素時,被稱為空隊列。隊列的結構如圖2-11所示。

圖2-11 隊列結構示意圖

(5)其他數據結構

其他數據結構如散列表、圖形結構等都是很重要的數據結構。單純按照查詢速度來看,在這幾種數據結構中,數組和鏈表結構最慢,樹結構較快,散列表最快。關于其他數據結構,本書不再具體介紹。

2.2.3 數據模型

1.數據模型的概念

數據模型,是為了更好地描述一組數據的概念和定義,而對現實世界數據特征進行的抽象和模擬。在數據庫中數據的存儲方式依賴于數據模型。要想更有序、安全地把數據保存到數據庫,并從數據庫中高效讀取,必然要創建成熟有效的數據模型。因此,數據模型是數據庫系統的理論核心和基礎。數據模型所描述的內容包括三個部分:數據結構、數據操作、數據約束。

(1)數據結構

數據結構的有關概念筆者在前面講解過了。理論上數據模型可以使用任意的數據結構,但考慮到性能問題,就要做出不同選擇。比如使用數組結構,在進行遍歷操作時速度會相當快,但是在進行新增與刪除操作時速度就稍差了。相比之下,如果使用鏈表數據結構,在進行新增與刪除操作時,速度就快很多。

(2)數據操作

數據操作主要定義了在相應的數據結構上的操作類型和操作方式。常見的數據操作是對數據庫中的數據進行增加、刪除、修改、查找等操作。刪除和修改操作都是建立在查找操作的基礎上的,所以完美的數據模型應該是具有較高的插入效率和查找效率的。

(3)數據約束

數據約束主要用來描述數據庫中數據結構之間的語法、詞義聯系以及彼此之間的相互約束和制約關系(比如MySQL使用外鍵保證數據之間的數據完整性)。

2.數據模型的種類

按不同的應用層次,數據模型分成三種:概念數據模型、邏輯數據模型、物理數據模型。

(1)概念數據模型

概念數據模型(CDM)的抽象性最高,關注現實世界與數據世界的關系,不關注數據的底層細節,為構建邏輯數據模型奠定基礎。概念數據模型必須換成邏輯數據模型,才能在數據庫管理系統中實現。

在概念數據模型中,最常見的是E-R模型、擴充的E-R模型、面向對象模型,以及謂詞模型。其中E-R模型圖就是實體聯系模型(Entity Relationship Diagram),如圖2-12所示,是用矩形框表示實體(比如“產品”是一個實體),用橢圓圖框表示實體的屬性(比如“產品名稱”是產品的一個屬性),用實心線段將屬性與相應關系的實體連接起來,用菱形框表示實體之間的聯系成因,在菱形框內寫明聯系名(比如“上架”是連接產品與銷售網站的成因),并用實心線段分別與有關實體連接起來,同時在實心線段旁標上聯系的類型。

圖2-12 E-R模型示例圖

(2)邏輯數據模型

邏輯數據模型(LDM)是直接面向數據庫的邏輯結構,涉及計算機系統和數據庫管理系統。這種數據模型架起了用戶和系統之間的橋梁。

在邏輯數據模型中,較常見的是層次模型、網狀模型、關系模型,其中最常見的是關系模型,其對應的數據庫被稱為關系型數據庫,如MySQL、DB2、Oracle等。

(3)物理數據模型

物理數據模型(PDM)是在邏輯數據模型的基礎上,考慮各種具體的技術實現因素及硬件因素,進行數據庫體系結構設計,真正實現數據在數據庫中的存儲。

因此物理數據模型的設計內容較為詳細,包括數據庫的存儲過程、操作、觸發、視圖和索引表等。

2.2.4 數據庫

1.數據庫的概念

數據庫是存儲在計算機系統內的,結構化的、集成的、相關的、共享的、可控制的數據集合。數據庫就是儲存數據的倉庫,只不過這個倉庫的數據必須按照一定的格式存放,因為數據的存放必須便于數據的查找。可以這樣理解:將數據按照一定的規則,結構化地儲存在一個相當于磁盤的地方,這個地方就是數據庫。

數據庫由數據庫管理系統管理。數據庫管理系統是一種操縱和管理數據庫的大型軟件,用于建立、使用和維護數據庫,簡稱DBMS。數據庫管理系統具有存儲、截取、安全保障、備份等基礎功能。

在諸多數據庫中,最常見的是關系型數據庫和非關系型數據庫。

2.關系型數據庫

(1)關系型數據庫的概念

關系型數據庫,是一種基于實體聯系模型(如E-R模型)的數據庫。世間萬物都是通過實體與屬性、實體與實體之間的關系折射出的關系模型。關系型數據庫定義的就是實體與屬性的集合。比如人有年齡、姓名等屬性。

關系型數據庫有MySQL、Oracle、SQL Server、DB2、Informix等,其中最常見的是MySQL。由于MySQL使用類似二維表格的存儲形式,因此其和頁面報表的組合比較完美,搭配PHP和Apache可以組成良好的開發環境。

此外,比較常見的關系型數據庫還有Oracle,在數據量很大的時候,其非常有用。比如擁有千萬量級以上數據的數據庫,通常會使用Oracle。

(2)范式

提到關系型數據庫,就不得不說范式。范式是數據庫設計規范方面的一個概念,是圍繞著關系型數據庫而形成的規則和約束。范式有很多條,前三條范式是關系型數據庫創建的基礎。

①第一范式:每一列不能有重復的屬性值

第一范式(1NF)是指數據表中的每一列不能有多個值,換言之,每一列的屬性的值都必須是不可再分的。如果實體中的某個屬性有多個值,必須將之拆分為不同的屬性。不滿足第一范式的數據表示例,如表2-4所示。

表2-4 不滿足第一范式的數據表示例

一個人的電話號碼可能同時有座機號碼和手機號碼兩種形式,因此應該將“電話號碼”屬性分為“座機號碼”和“手機號碼”兩個屬性才能滿足第一范式,如表 2-5所示。

表2-5 滿足第一范式的數據表示例

②第二范式:每個行的數據不重復

第二范式(2NF)和第三范式是容易混淆的。第二范式是在滿足第一范式的前提下提出的,主要包含兩點:其一,一個數據表必須有一個主鍵(主鍵是由一個或多個字段組成的,區分數據的唯一性,主鍵的概念會在下文繼續講到);其二,沒有包含在主鍵中的列必須完全依賴于主鍵,而不能只依賴于主鍵的一部分。如果不滿足第二范式,容易產生冗余數據,如表2-6所示。

表2-6 不符合第二范式的數據表示例

一個訂單中可以包括多種商品,所以在表2-6中,“訂單編號”和“商品編號”才是主鍵,“折扣”“商品購買數量”等屬性完全依賴于主鍵(即當主鍵確定下來時,這些屬性就是明確的),但是“商品單價”“商品名稱”等屬性與“訂單編號”沒必然關系,它們只依賴于“商品編號”,所以該表不符合第二范式。這種情況造成的最直觀的問題就是,如果有 50 萬個訂單都買了鼠標,那么鼠標的單價和名稱就要在表中出現50萬次,這就造成了數據冗余,因此應將“商品單價”“商品名稱”從原表拆分出去,從而將一個表變為兩個表,如表2-7、表2-8所示。

表2-7 將商品信息拆分出一個表

表2-8 修改后的訂單詳情表

③第三范式:即直接性,數據表的每一列都要和主鍵直接相關,而不能間接相關。

第三范式(3NF)要求數據表中不能存在“非主鍵列 A 依賴于非主鍵列 B,而非主鍵列 B 依賴于主鍵”的情況。比如,有一個“爸爸信息表”,里面的屬性有:爸爸、兒子、女兒、女兒的小熊、女兒的氣球,這就不符合第三范式,因為“爸爸”與“女兒的小熊”“女兒的氣球”都不是直接的相關。在這種情況下,需要將其改成兩個表。其一是“爸爸信息表”,包含屬性:爸爸、兒子、女兒;其二是“女兒信息表”,包含屬性:女兒、女兒的小熊、女兒的氣球。該案例的修改前后示意圖如圖2-13所示。

圖2-13 “爸爸信息表”修改前后示意圖

3.非關系型數據庫

對于大量的半結構化數據和非結構化數據,人們針對其存儲、并發以及擴展能力而設計出了非關系型數據庫,像Google的Bigtable、Amazon的Dynamo,以及Apache的Hbase等。

非關系型數據庫是松散的、無嚴格結構規范的,被稱為 NoSQL,是傳統關系型數據庫的有效補充,用于對存儲要求高、并發處理較多的場合。常見的非關系型數據庫有MongoDB、HBase等,它們以鍵值對(key-value)的形式存儲,是類似JSON的格式,因此可以存儲比較復雜的數據類型。非關系型數據庫的存儲形式如下。

在非關系型數據庫中,MongoDB 是最著名的,其功能非常豐富,最大的特點是其支持的查詢語言非常強大,有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。

非關系型數據庫都是針對某些特定的應用場景而設計的,因此該類數據庫往往具有極高的選擇性和強大的性能。

4.為什么要了解數據庫

后端產品經理的很多工作都是圍繞數據進行的。一方面,基礎數據的維護和用戶行為數據的采集本身就是后端產品的工作范疇;另一方面,后端產品的多數功能設計都是圍繞數據的存取、運算、獲取、推送等進行的。隨著業務不斷發展,數據庫在擴大、數據量在增加,數據需求的調研和分析越來越復雜,如果后端產品經理不了解數據庫,就會讓自己的工作難以進展。比如,當后端產品經理要拉取數據做驗證的時候,因為數據存儲在不同的數據表中,就需要反復進行聯表查詢,在這種情況下,很難有程序員能夠隨時協助,如果后端產品經理自己掌握了數據的查詢和分析方法,就可以更高效地開展工作。

那么,作為后端產品經理,要對數據庫了解到什么程度呢?筆者認為達到以下兩點即可。

(1)理解數據庫的作用原理,以便更好地與開發人員互動溝通,理解開發人員的思路。

(2)會用基礎的 SQL 查詢,懂得數據表的創建、數據去重規則等知識,就可以更好地參與到數據問題的分析和數據方案的設計中。

2.2.5 常用的關系型數據庫管理系統:MySQL

1.MySQL的簡介

(1)MySQL的特點

MySQL 是最流行的關系型數據庫管理系統之一,其將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了查詢速度并提高了靈活性。MySQL 數據庫的存在,使得變量的增加、刪除、修改、查找操作只需在數據庫層面完成即可,不用到代碼層面處理,既安全又高效。

由于其體積小、速度快、總體擁有成本低,尤其是其開放源碼,使得一般中小型網站的開發,都使用MySQL作為數據庫管理系統。初學者學習數據庫往往都是從學習MySQL開始的。

(2)MySQL的安裝

MySQL的安裝界面如圖2-14所示。

圖2-14 MySQL的安裝界面

首先要在PC端安裝MySQL服務器,然后通過公司的數據庫地址、密碼連接上數據庫(具體可以找開發人員協助完成)。這樣你就可以進入到數據庫管理系統中,查看其中的數據庫、數據庫中的各個表,以及表里的數據。

2.MySQL的數據庫、數據表、應用程序等之間的關系

(1)MySQL的結構關系

MySQL 數據庫管理系統可以管理多個數據庫,每個數據庫可以創建很多個表,每個表描述一種實體與多個屬性的關系,每個屬性就是一個字段,每個字段有不同的取值。數據庫管理系統、數據庫、表、字段、值之間的關系如圖2-15所示。

圖2-15 數據庫管理系統、數據庫、表、字段、值之間的關系

(2)數據庫與應用程序之間的關系

數據庫與數據庫之間可以交換信息,數據庫與應用程序之間也可以交換信息。數據庫與應用程序的對應關系如圖2-16所示。

圖2-16 數據庫與應用程序信息交換對應關系示意圖

3.MySQL拆表存儲

理論上,每個實體至少對應一個數據表,表中的字段就是實體的屬性或衍生屬性,但是實際上一個實體的屬性往往被拆分到多個數據表中存儲。在這種情況下,一旦需要查詢,就要通過聯表才能完成。既然聯表很麻煩,那么為什么非要拆表存儲呢?其實這和前面提到的范式有很大關系。

在實際情況中,一個實體所具有的屬性會有很多,如果將所有屬性放入一個表中,那么其產生的數據表往往也就包含很多信息。當這個數據表中的數據量很大的時候,其缺陷就非常明顯:首先是數據冗余,其次是維護(比如編輯)困難。因此龐大的數據表要分表存儲,該理念和第二范式的思想是一致的。

例如有一個描述用戶發布消息的表,每當用戶發表一條消息,就需要把他的昵稱、性別、姓名、消息等數據都插入到表中,這樣一條一條數據累積下去,如果在未來的某一天里,用戶突然修改自己的昵稱,那么我們要遍歷整張表,去更新他的每條數據中的昵稱。在這種情況下,修改是不現實的,所以就需要把原來的表中的用戶信息和消息信息分別存儲。

拆表之后,通過姓名就可以查到用戶的個人信息,又可以通過用戶的 ID 查到他發出的所有消息。

4.數據表

(1)數據表的基本信息

數據存儲于數據表中,數據表中每一條基本的數據都由數據類型、字段(也叫變量或者參數)、字段值等組成。以下面的數據表結構信息(局部)為例。

該部分內容表達的主要信息如下。

①表名是“s_rule”。

②各個字段都有默認值,比如“rule_type_id”的默認值為“0”。

③各個字段都不允許為空值。

④規定了各個字段的數據類型,比如“rule_id”的數據類型為11位整數。

⑤各字段帶有注釋,比如“rule_id”的注釋為“主鍵ID”。

(2)數據表的主鍵和外鍵

①主鍵

MySQL的每張表只能有一個主鍵(前面談范式的時候提到過)。主鍵即主關鍵字,可以由一個或多個字段組成,并且主關鍵字的列不能包含空值。一般使用該表的 ID做主鍵。主鍵的最大特征是其具有唯一性,即由主鍵標示的各行數據不重復。

主鍵主要用于和其他表進行外鍵關聯,以及對本表的修改與刪除。當兩個表需要進行關聯時,主關鍵字用于在一個表中引用來自另一個表中的特定記錄。

②外鍵

如果表A的主關鍵字也是表B中的字段,則該字段稱為表B的外鍵。表A稱為主表,表B稱為從表。外鍵可以保持數據一致性、完整性,使兩張表形成關聯。關于主鍵、外鍵的例子如圖2-17所示。

圖2-17 關于主鍵、外鍵的例子

(3)數據表的索引

①索引的概念

在講解數據結構的樹結構時,筆者曾提到過索引。索引是由開發人員用代碼創建的,對數據庫表中的一個或多個字段值進行排序的一種結構。數據庫索引好比是一本書的目錄,能提升數據庫的查詢速度。例子如下所示。

如果“id”沒有做索引,這個查詢操作就必須遍歷整個表,直到找到“id”等于“44”的這一行為止;如果“id”做了索引,則直接在索引表里找出“id”等于“44”,就可以直接得知這一行的位置,更快找到這一行。

②索引不能太多

索引有助于提高查詢速度,但不是越多越好,原因如下。

第一,創建和維護索引需要開發人員寫代碼,其耗費的時間隨著數據量的增加而增加。

第二,當對表中的數據進行增加、刪除和修改的時候,索引也要進行動態的維護,這樣就增加了維護的成本。

第三,索引需要占用物理存儲空間。

因此,一個數據表的索引不宜過多,建議最多5個。索引不可能滿足所有的場景,但是可以滿足絕大部分的場景。

5.數據庫相關需求方案的注意事項

后端產品的很多產品需求方案都會涉及數據表的創建、聯表查詢等,因此在需求方案設計的過程中要注意如下一些細節。

(1)建表的時候可以增加預留字段。因為當數據量大的時候很難再增加新字段,所以數據增長較快的表一定要預留幾個字段的空位,便于日后數據表的擴展。

(2)當一個表無法再加字段的時候,可以增加擴展表。一般以原表的表名加上后綴“_ext”作為擴展表的表名,兩個表通過原表 ID 進行關聯。比如原表的表名為“order_goods_shipping”,其擴展表的表名就可以用“order_goods_shipping_ext”。

(3)對數據表新增字段的時候,要考慮該表已有數據的初始化處理。比如,將歷史數據對應該新字段的值,全部初始化為空字符串或某一個默認值。

(4)統一規范數據表的表名前綴,舉例如表2-9所示。

表2-9 數據表名前綴舉例

(5)命名要規范,具體的規范舉例如下。

①庫名、表名、字段名、索引名,統一使用小寫字母、數字,必要的時候,以下畫線連接,比如“訂單商品數據表”可以命名為“order_goods_table”。

②庫名、表名、字段名加起來不要超過30個字符。

③庫名、表名、字段名不要單獨使用數據庫的常用關鍵字,像“lock”“time”“date”“return”“user”等,可以加前、后綴,比如“sale_date”。

④命名不能使用特殊字符,如“%”“-”等。

(6)產品經理在了解數據庫之后,設計方案的思路會清晰許多,但是最終的方案還是由開發人員綜合評定的。如果產品經理將一些字段、表名等內容寫進方案的話,要謹慎核實,并和開發人員做好溝通。

2.2.6 使用基本的SQL語言進行數據庫查詢

1.數據庫查詢介紹

SQL是結構化查詢語言(Structured Query Language)的縮寫,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系型數據庫系統,同時也是數據庫腳本文件的擴展名。

SQL 是數據庫通用的操作語言(不同版本存在著細微差異),語句很簡單,運算速度很快,是最重要的關系型數據庫操作語言,并且它的影響已經超出數據庫領域,在其他領域(比如人工智能領域的數據檢索)也受到重視和采用。

2.基礎SQL語句舉例

(1)數據查詢語句

①基礎的查詢語句

對產品經理來說,數據查詢語句是比較簡單的,也是使用次數最多的。最基本的查詢語句是“SELECT+目標字段+FROM+表名”,表示從表中查詢數據的目標字段。例子如下。

如果同時查詢多個字段,則目標字段之間用“,”隔開。例子如下。

如果查詢全部字段,則用“*”代替具體的字段。

②配合函數查詢

SELECT語句配合函數可以滿足更多需求。常用的函數包括但不限于如下。

COUNT():統計記錄數。例子如下。

AVG():計算字段值的平均值。例子如下。

SUM():計算字段值的總和。例子如下。

MAX():查詢字段的最大值;MIN():查詢字段的最小值。例子如下。

③配合篩選條件查詢

基本的篩選條件用“WHERE”連接,句式為“SELECT+目標字段+FROM+表名+WHERE+條件”。例如,我們要從“學生表”中查詢年齡為14歲的學生的姓名,代碼如下。

④對查出的結果排序

基本的排序用“ORDER BY”表示,句式為“SELECT+目標字段+FROM+表名+ORDER BY+排序字段+DESC/ASC”。例如,我們要從“學生表”中查詢學生的全部信息,并按照年齡降序排列,代碼如下。

⑤對結果分組

用“GROUP BY”語句進行分組,例子如下。

⑥字段拼接輸出

用“CONCAT”可以拼接多個字符串。例如,我們要將employee_tbl表中的用戶年齡、姓名、工作日等連接在一起,代碼如下。

⑦聯表查詢

聯表查詢的句式為“左表+JOIN+右表+ON+關系字段”。在具體應用中,JOIN往往與前綴結合,比如“INNER JOIN”表示內聯接,即查找兩張表共同擁有的字段;“LEFT JOIN”叫左聯接,以左表(“JOIN”前的那張表)為主,如果右表有共同字段,則一并返回,如果沒有,則為空;另外還有“FULL JOIN”“RIGHT JOIN”等。例子如下。

注意,在該例句中,“order_table a”意為:用“a”來代表“order_table”。

⑧其他常用的SQL查詢語句,如表2-10所示。

表2-10 其他常用的SQL查詢語句

(2)數據表的更改

產品經理一般不會更改正式數據庫的數據,但是可以了解相關的知識點。數據的更改主要包括插入(新增)、刪除、更新、創建等。

①插入記錄

句式為“INSERT INTO+表+VALUES”,用于在表中插入記錄,例如我們要在表中添加一行張三的記錄,代碼如下。

②新增一列

用“ALTER ADD”來增加表的列(即字段)。例如,我們要在“student_table”表中添加一列“title(職位)”,代碼如下。

注意:“varchar(10)”是對插入的字段“title”的數據類型的定義。

③更新數據

句式“UPDATE+表+SET”用于更新表的數據。例如,我們要讓table1表中的所有人的工資都增長20%,代碼如下。

④數據表的創建、回收

創建表的句式:“CREATE TABLE+表名”。例子如下。

回收表的句式:“DROP TABLE+表名”。注意,執行“DROP TABLE”語句后,表被放在回收站中,并不是被直接刪除。如果想要直接刪除表(不進回收站),則使用句式“DROP TABLE+表名+PURGE”。

3.SQL使用注意事項

(1)提升查詢速度

①查詢時,盡量只列出需要查詢的字段,不建議查詢全部,以避免影響查詢速度。例如下面的代碼,會影響查詢速度。

建議將其優化為如下代碼。

②盡量避免進行全表掃描。如果我們只需要返回一條結果,可以使用“LIMIT 1”指令,能夠提高效率。

(2)在某些情況下索引無法被使用

①SQL 中的“OR”指令表示并列關系,比如“WHERE customer_id='250'or amount=3.96”。

用“OR”分割開的條件,若其前面的條件有索引,后面的條件沒有索引,那么前面的索引也不會被用到,該查詢仍是要進行全表掃描的。

②負向查詢不會使用索引,比如“NOT”“NOT IN”“NOT LIKE”“<>”“!=”“!=”“!<”等。例如,下面的代碼不會使用索引。

(3)MySQL中的NULL和空字符串

在SQL語句中,NULL通常指的是不適用的、無意義的、無效的、不存在或之后將要加入的數據,而空字符串('')表示該字符串的值就是空(注意空字符串的單引號之間是沒有空格的)。比如,電話號碼字段是NULL的時候,可理解為“該人員是否有電話號碼是未知的”;而用空字符串表示的話,就可理解為“該人員沒有電話號碼”。

在SQL語句中,判斷NULL的SQL語句應該使用is NULL或者is not NULL,但判斷空字符串則應使用“=”或者“<>”。比如一條數據的A字段值為NULL,此時使用關鍵查詢條件“A is NULL”,是可以查出該條數據的;但是關鍵查詢條件使用“A='NULL'”,就查不到該數據。

主站蜘蛛池模板: 石景山区| 武穴市| 滨州市| 察雅县| 灵山县| 阿拉善右旗| 建宁县| 万载县| 浙江省| 南安市| 敦煌市| 青阳县| 兴隆县| 绍兴县| 忻城县| 河池市| 香港 | 阳春市| 北安市| 邓州市| 高陵县| 鄂伦春自治旗| 南昌市| 忻城县| 屯门区| 新宁县| 宜黄县| 治多县| 安仁县| 黎川县| 句容市| 崇左市| 青龙| 仙桃市| 互助| 天全县| 长沙县| 北海市| 商丘市| 罗城| 湛江市|