封面人物

劉承羽

前言

這是我學習《PHP和MySQL Web 開發》的讀書筆記,一些重要的知識點我會記錄下來,當然只會寫我覺得重要的。

  1. 如果有幸有人看到這個學習筆記了,你要結合著書看,不要光看這個筆記。
  2. 在筆記裏我會記錄一些我學習中遇到的問題和解決辦法與注意事項。
  3. 為了方便管理和查找,文章或者說筆記的目錄我就按照書裏的排了,方便對比著看。
  4. 不是教學!重要的事說一遍!我是PHP和MySQL 的初學者,我本身是個前端,為了面向工資編程,拓寬知識面才學的。
  5. 其實還是有一些私心得,因為都說教學相長 和 小黃鴨調試法,我這個是小老虎學習法,對著小老虎講知識點,保證自己學的紮實,能掙錢。
  6. 歡迎探討和指教,須知一山更比一山高,但是拒絕槓精!

本章主要是介紹了:

  • 關係資料庫的概念和術語
  • Web資料庫的設計與架構

基礎知識還是要有的,方便了解一些專有名詞,包括資料庫是幹啥的,後端說的時候你聽了至少不懵逼。開始吧!

8.1關係資料庫的概念

下方帶灰色底的文字的都是摘錄的書中原文!可放心閱讀,以後不再說明。

當前使用關係資料庫的時候,並不需要了解關係理論(這是一件好事),但還是需要理解一些關於資料庫的基本概念。

8.1.1表格

一個表格就是一個數據的表格,就和Excel表格一樣,儲存著數據,就是下面這樣,裡面內容不用管,就是讓你看下形式。(一般就叫表)

books
+---------------+-------------------+-------------------------------------+-------+
| id | author | title | price |
+---------------+-------------------+-------------------------------------+-------+
| 0-672-31697-8 | Michael Morgan | Java 開發 | 38.49 |
| 0-672-31745-1 | Thomas Down | Linux 開發 | 27.49 |
| 0-672-31509-2 | Pruitt,et al. | 時間管理 | 27.49 |
| 0-672-31769-9 | Thomas Schenk | 開放系統管理 | 54.99 |
| 0-672-31000-1 | 李重樓 | web開發筆記 | 99.99 |
| 0-672-31000-4 | Nicholas C.Zakas | JavaScript高級程序設計(第3版) | 99.99 |
| 0-672-31000-5 | 李重樓 | web插入資料庫 | 53.20 |
| 0-672-31000-6 | 李重樓 | 網站建設與拆毀 | 44.36 |
+---------------+-------------------+-------------------------------------+-------+

表名叫books,有id,author,title,price 四個數據列。每個列裏對應的是相同的數據類型,每一行對應著是一條由id,author,title,price對應的值構成的數據。

如:0-672-31000-1,李重樓, web開發筆記, 99.99 。這個就是一條數據好理解吧?

注意:豎著的叫列,橫著的叫行。

8.1.2列

表中的每一列都有唯一的名稱,包含不同的數據。此外每一列都有一個相關的數據類型。(注意:豎著的叫列,橫著的叫行。)

如上方表格所示,author 列的數據類型就是字元串類型。這個也很好理解吧?具體都有多少數據類型,在後面有介紹,別急,慢慢看。

重點來了!!!

有時候,列也叫做 域 或者 屬性!

為啥這是重點?

因為以後開發的時候怎麼叫的都有,人家說 列 你腦子裡知道是啥,豎著的那豎行叫列,人家說 域 或者說 屬性 你就不知道是啥了那可不行,招人笑話!

也有叫欄位的,但是這個一般指 列名欄位,比如上面寫的:id,author,title,price 這些。

8.1.3行

表中的每一行代表一個客戶。每一行具有相同的格式,因而也具有相同的屬性。行也稱為記錄。

我上面的表格示例表示每一行代表一本書。

具有相同格式是說:第二行的格式和第三行的格式一定相同,好理解吧?其實所有行格式都相同。

重點來了!!!

行也稱為記錄。

為啥這是重點?道理剛才說過了。不說了。

8.1.4值

每一行由對應於每一列的單個值組成,每個值必須與改了定義的數據類型相同。

這個如果不理解的話,你私信我,我單獨給你解釋。

8.1.5鍵

書裏的介紹你先看。

看完了嗎?沒看完不要看下面的筆記。看不下去也要看,讀,一句話一句話的讀。讀完整個8.1.5。

書讀百遍其義自見是有道理的,我也笨,你以為我比你聰明?我有老師教?不!俺沒有,俺讀了三遍,認真的讀了三遍,我就明白了。

有時候你不是學不會,是不認真學,不認真理解,聽我的,感覺一遍沒明白,就再讀一遍。仔細的讀。讀出聲的那種。

看完繼續!

書裏整段介紹的提煉的就是一句話:鍵,每一條數據所對應的唯一的標識。

書中舉例說明的是人名,人名不唯一啊!

你回想一下,你,有個朋友說:我認識一個人叫小明。你說:哎呀,巧了,我也認識一個叫小明的。

結果一對,他說的是個女的,你說的是個男的,或者你說的是東北的小明。他說的是臺灣的小明。根本不是一個人。

這就書中舉名字例子要表達的,所以我們需要一系列信息來區分開兩個小明或者確定其中一個你認識的小明,比如:性別,戶籍所在地,出生年月,外加其他的體態外表特徵等。

現實生活中:你的身份證號,就是這些信息綜合抽象而成的,就是在這個「社會資料庫」中,人口表中的 鍵,確認你身份的唯一ID。(ID 是identity的縮寫,意思為身份)

這麼一想,是不是感覺你家的戶口本其實就很像表?戶口本來有叔叔,阿姨和你,然後戶口表中唯一確定你家三口誰是誰的最快最便捷的身份標識是不是身份證號?

來,再記一遍:鍵,每一條數據所對應的唯一的標識。

表中的標識列稱為 鍵 或 主鍵。

這是書中說的,書裏說的對,標識列 稱為 鍵 或 主鍵,和你說的有衝突啊?!

不衝突的。

說表的主鍵是什麼的時候?

請看上方的books表,上方books表裡的id列就是表的主鍵。

為啥id就是主鍵別的不可以嗎?

沒有為啥!!因為我在寫這個表的時候,就遵循的id欄位這一列,就是唯一的標識數據,用來做主鍵的。

那你說的,鍵,每一條數據所對應的唯一的標識。是什麼意思?

舉例:你找作者叫李重樓的,書名為《網站建設與拆毀 》,44.36一本的書。

這個是不是一條數據?

他的id是 0-672-31000-6 ,這個 0-672-31000-6 就是這一條數據所對應的唯一的標識。

再跟我讀一遍:鍵,每一條數據所對應的唯一的標識。嗯呢,乖~

通常,資料庫由多個表組成,可以使用鍵作為表格之間的引用。

這種關係用關係資料庫術語來描述的時候就是外鍵。

這個出現在別的表中的鍵,叫外鍵。

這個看書吧,我覺得很簡單,我實在懶得畫圖了。

8.1.6模式

資料庫整套表格的完整設計成為資料庫的模式。

以書中列子來說:Customers(CustomerID,Name,Address,City),這個就是文本格式表示,有的人會手畫表示,怎麼都可以,你整明白了就行。我就對這個文本格式的模式進行一下解釋吧。

  • Customers:表的名稱,你家的戶口本,戶口本三個字就是表名。
  • CustomerID,Name,Address,City 都是表格的列。
  • CustomerID 帶下劃線的是的是表示該列是主鍵。
  • CustomerID 斜體的表示該列是所在關係表的外鍵。
  • CustomerID 又是斜體還有下劃線的表示的是:該列是標識列 叫 主鍵,同時該列是所在關係表的外鍵。

8.1.7關係

這裡還是比較複雜難理解,至少我是這麼覺得。

所以,如果你覺得很簡單,恭喜你,你是個天才啊~,但是你也覺得難,那麼表示確實正常,不要氣餒,老規矩,先讀三遍。

讀完了?

我開始照抄書了啊~

關係資料庫中有3種基本的數據關係類型。根據關係雙方所含對象的多少,可以將這些關係分為 一對一,一對多,多對多3種關係。

定義下了,有三種關係。那麼開始理解。

一對一關係表示關係雙方只有一個對象相互對應。

一對一是好理解的,定義都說了,你只能有一個對象,你對象也只能有一個男/女朋友,而這個男/女朋友得是你。

有一個人好幾個對象的啊?那就是下一步說的了:

在一對多的關係中,一個表中的一行與另一個表中的多行具有相互關聯的關係。

這個叫一對多,但是這個不舉男女戀愛的例子了,因為太扎心,咱講父與子的關係。

一個人可以生多個孩子,這些孩子都管這個人叫爹,這個爹就是「一行」,這些孩子就是「多行」,他們的關係是父子關係,如果換成顧客買東西那就是一個顧客可以購買n多件商品他們是購買關係(姑且這麼叫吧)。

在多對多的關係中,表中的多行與另一個表中的多行具有相互關聯的關係。

這個叫多對多,其實我一開始看的時候在想,什麼情況下會出現多對多呢?

現實生活中有什麼實際例子能幫我理解消化一下嗎?

我就搜啊搜,看看有啥實際應用的列子嗎?然後我搜到一個很貼近每個人生活,很好的例子:數據表對應關係(一對一、一對多、多對多)。

作者是:Abeam,他個人描述深深的刺激了我,描述是:編程大忌,懶~~~

因為我就懶....

扯遠了。

多對多,在資料庫中也比較常見,可以理解為是一對多和多對一的組合。要實現多對多,一般都需要有一張中間表(也叫關聯表),將兩張表進行關聯,形成多對多的形式。例如: 老師表、班級表、科目表,中間表為:課程表。

例子很詳細了,A老師教一二班語文,B老師教一二班數學。你思考一下,教師是個表,表裡有AB兩位老師,班級是個表,有一二兩班。

班級表中一班對應兩位老師,A和B。教師表中A對應著兩個班,一班和二班。這個就是多對多,不知道你理解沒有。

暫時沒有理解也沒關係,在後續有實際的應用,會幫助你理解的。

我不得不獻上我的畫作了

自己看圖理解吧。

8.2 設計Web資料庫

本章主要是介紹了:

  • 關係資料庫的概念和術語
  • Web資料庫的設計與架構

基礎知識還是要有的,方便了解一些專有名詞,包括資料庫是幹啥的,後端說的時候你聽了至少不懵逼。開始吧!

書中是以 Book-O-Rama(拉瑪的書店?)的內容為例的,我也盡量吧。

customers
+------------+-----------------+--------------------+--------------------+
| customerid | name | address | city |
+------------+-----------------+--------------------+--------------------+
| 1 | 劉能 | 牡丹江大街 | 牡丹江 |
| 2 | 李重樓 | 北京中弘像素 | 北京 |
| 3 | 謝廣坤 | 保定市 | 保定 |
| 4 | Alan Wong | 1/47 Haines Avenue | 保定 |
| 5 | Michelle Arthur | 357 North Road | Yarraville |
| 6 | Melissa Jones | 紅莊 c3-1 | Nar Nar Goon North |
+------------+-----------------+--------------------+--------------------+
order
+---------+------------+--------+------------+
| orderid | customerid | amount | date |
+---------+------------+--------+------------+
| 1 | 3 | 69.98 | 2018-06-27 |
| 2 | 1 | 49.99 | 2018-06-26 |
| 3 | 2 | 74.98 | 2018-06-25 |
| 4 | 3 | 24.99 | 2018-06-24 |
+---------+------------+--------+------------+
books
+---------------+-------------------+-------------------------------------+-------+
| isbn | author | title | price |
+---------------+-------------------+-------------------------------------+-------+
| 0-672-31697-8 | Michael Morgan | Java 開發 | 38.49 |
| 0-672-31745-1 | Thomas Down | Linux 開發 | 27.49 |
| 0-672-31509-2 | Pruitt,et al. | 時間管理 | 27.49 |
| 0-672-31769-9 | Thomas Schenk | 開放系統管理 | 54.99 |
| 0-672-31000-1 | 李重樓 | web開發筆記 | 99.99 |
| 0-672-31000-4 | Nicholas C.Zakas | JavaScript高級程序設計(第3版) | 99.99 |
| 0-672-31000-5 | 李重樓 | web插入資料庫 | 53.20 |
| 0-672-31000-6 | 李重樓 | 網站建設與拆毀 | 44.36 |
+---------------+-------------------+-------------------------------------+-------+

這是我寫的測試數據,後續你寫的時候也可以添加一些自己的數據,很有意思的。目前先看書就可以。

8.2.1考慮要建模的實際對象

當創建一個資料庫時,我們經常為現實世界的實體和關係建立模型,並且儲存這些實體對象與關係的信息。

書中這句話就涵蓋了標題的意思。

這一節也沒啥好說的,你保證能理解資料庫表,列,行,欄位,值,這些概念,看的懂書中給出圖例的鍵,外鍵就可以。

也別著急實際操作,切勿操之過急。畢竟古人云:捷克,斯洛伐克 嘛。

8.2.2避免保存冗餘數據

來,跟我讀:避免保存冗(rǒng )餘數據。(多餘的重複或囉嗦內容(包括信息、語言、代碼、結構、服務、軟體、硬體等等)均稱為冗餘)

別笑,我之前默唸了好幾年的「沉餘」,不會,讀錯不丟人,丟人的是 不會,還不學。再讀一遍「 冗(rǒng )餘」。

這一節開篇沒啥說的做了一下自問自答,你先看吧。

看完咱們來畫重點。

重點來了!!!

三個"不規則"

1.修改不規則

書中舉了Juile在下了訂單後搬家了,需要在三個地方更新她的地址,進行三次同樣的操作。

這很容易使我們在一個地方修改數據,從而導致資料庫中的數據不一致,因為問題發生在修改資料庫的時候所以稱為「修改不規則」。

2.插入不規則

每次必須檢查Juile的數據(地址)是否與表中當前行一致,如果不檢查,可能會有兩行關於Juile相互衝突的數據,比如一條數據告訴我們Juile住二環,另一條則可能表命明她住南四環。

因為出現在插入數據的時候,所以稱之為「插入不規則」。

3.刪除不規則

如果訂單交貨,需要將Juile的訂單信息從資料庫刪除,也意味著她的地址沒有了。她下次再訂貨,還要單獨的提交一遍地址。

因為從資料庫中刪除一行的時候發生的,所以稱之為「刪除不規則」。(這點尤為重要,在電商公司拚命的獲取用戶隱私,地址這麼重要的數據,你在用戶收到快遞就給刪了?!這麼設計表你能被老大打死!)

通常,資料庫的設計不應該出現上述不規則中的任何一種。

書裏說的很含蓄,「通常」不這麼幹。我給你翻譯翻譯就是:除了DEMO 和入門學習!別雞兒這麼幹!(你們技術老大,或者負責人讓你這麼幹!你讓他寫下來簽字!)

這裡主要是介紹一些資料庫設計的基本原則,業界通用的,所以別煩躁,好好看,萬丈高樓平地起,輝煌還得靠自己!

8.2.3使用原子列值

你看到這的時候,我默認你是看完8.2.3這一節了。

有哪不懂的嗎?

沒有?

太好了!

我有!

使用原子列值得意思是對每一行的每個屬性只儲存一個數據。

你給我解釋一下這句話,或者你腦子過一下,這句話什麼意思。

如果你能毫不費勁的答出這句話什麼意思,我覺得你不應該看我的筆記,因為我覺得沒必要。

如果你一帶而過,沒有深入思考過這句話,或者我問了你,你解釋不上來,那麼,不要難過,為啥呃?

因為我第一遍,還沒寫筆記看的時候,也是一帶而過,因為我覺得木有用,不用深入看,不影響我搞後面的內容。

但是!

是誰說的來著?但是之前的話毫無意義!

我要寫筆記給你看的時候,我被這句卡住了!我解釋不上來!

我百度,我谷歌這句話,基本上全是照著書抄!根本沒解釋這句話!

經過我不懈的翻書以及修改關鍵詞,我搜到了!

原文章見此處:一個小時學會MySQL資料庫 ,我截取文章見此處:資料庫規範化。

原文中對MySQL資料庫有概要介紹,包括資料庫的歷史。大致閱讀時間半個小時。

而我呢,截取其中 1.4 部分,用來解釋上面那句話!

所謂第一範式(1NF)是指在關係模型中,對列添加的一個規範要求,所有的列都應該是原子性的,即資料庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。

即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一範式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一範式就是無重複的域。

這是其中第一範式的解釋,其中說:原子性,即實體中的某個屬性有多個值時,必須拆分為不同的屬性。對「使用原子列值得意思是對每一行的每個屬性只儲存一個數據」。進行了解釋。

如果不懂去看原文,我都能看懂,你應該也行。還是不懂,私信我。咱倆一起學習!

補充一下:推薦看原文,別嫌棄麻煩!至少我截取的部分 資料庫規範化 要看,多看幾遍,不累的。

所以說,寫閱讀筆記出來,對自己也是一種提高,逼著自己仔細看書,學的紮實~

8.2.4 選擇有意義的鍵

答案:略。

8.2.5考慮需要詢問資料庫的問題

答案:略。

8.2.6 避免多個空屬性的設計

答案:略。

8.2.7避免多個空屬性的設計

答案:略。

上面的 「答案:略」 是不是在初高中參考書裏經常見啊?

我是經常見,很煩人,但是那兩節我真的沒有要記得,所以略就略吧。

這三節主要是聯繫上下文,傳達基礎理論知識的。多看幾遍沒壞處,我覺得沒必要是因為我記腦子裡了~啦啦啦啦

8.3 Web資料庫架構

書裏的圖8-9

一個典型的Web資料庫事務包含下列步驟,這些步驟在圖8-9已經標出。以Book-O-Rama書店為例,我們逐個解釋這些步驟。

1)用戶的Web瀏覽器發出HTTP請求,請求特定Web頁面。例如,該用戶可能以HTML表單的形式,要求搜索Book-O-Rama書店裡所有由Laura Thomson編寫的圖書。搜索結果網頁稱為results.php。2)Web伺服器收到results.php的請求,獲取該文件,並將它傳到PHP引擎,要求它處理。3)PHP引擎開始解析腳本。腳本中有一條連接資料庫的命令,還有執行一個查詢(執行搜索圖書)的命令。PHP打開通向MySQL資料庫的連接,發送適當的查詢。4)MySQL伺服器接受資料庫查詢並處理。將結果(一個圖書的列表)返回到PHP引擎。5)PHP引擎完成腳本運行,通常,這包括將查詢結果格式化成HTML格式。然後再將輸出的HTML返到Web伺服器。6)Web伺服器將HTML發送到瀏覽器。這樣用戶就可看到她所搜索的圖書。這個過程基本上與腳本引擎和資料庫伺服器無關。通常,Web伺服器軟體,PHP引擎和資料庫伺服器都在同一臺機器上運行。但是,資料庫伺服器在另外一臺機器上運行也是非常常見的。這樣做是出於保密、提高性能以及負載平衡的原因而考慮的。從開發的角度來看,要做的事情基本上是一樣的,但是它能夠明顯提高性能。

這一節我是純照書敲的,如過你搞過前端開發,應該一看就懂。

不懂就熟讀三遍,學完了整本書你再回來看這段,你就會發現真的沒有什麼要說的,啦啦啦啦~

第8章的內容完畢了,其實你要是跟著我這筆記看,包括反覆閱讀加理解,時間往寬了說,一天!8個小時~絕對能整明白的,不要怕難~加油哦~看好你哦~


推薦閱讀:
相關文章