1. 程式人生 > >廖雪峰官網之資料庫

廖雪峰官網之資料庫

訪問資料庫

程式執行的時候,資料都是在記憶體中的。當程式終止的時候,通常都需要將資料儲存到磁碟上,無論是儲存到本地磁碟,還是通過網路儲存到伺服器上,最終都會將資料寫入磁碟檔案。

而如何定義資料的儲存格式就是一個大問題。如果我們自己來定義儲存格式,比如儲存一個班級所有學生的成績單:

名字 成績
Michael 99
Bob 85
Bart 59
Lisa 87

你可以用一個文字檔案儲存,一行儲存一個學生,用,隔開:

Michael,99
Bob,85
Bart,59
Lisa,87

你還可以用JSON格式儲存,也是文字檔案:

[
    {"name":"Michael","score":99},
    {"name":"Bob","score":85},
    {"name":"Bart","score":59},
    {"name":"Lisa","score":87}
]

你還可以定義各種儲存格式,但是問題來了:

儲存和讀取需要自己實現,JSON還是標準,自己定義的格式就各式各樣了;

不能做快速查詢,只有把資料全部讀到記憶體中才能自己遍歷,但有時候資料的大小遠遠超過了記憶體(比如藍光電影,40GB的資料),根本無法全部讀入記憶體。

為了便於程式儲存和讀取資料,而且,能直接通過條件快速查詢到指定的資料,就出現了資料庫(Database)這種專門用於集中儲存和查詢的軟體。

資料庫軟體誕生的歷史非常久遠,早在1950年資料庫就誕生了。經歷了網狀資料庫,層次資料庫,我們現在廣泛使用的關係資料庫是20世紀70年代基於關係模型的基礎上誕生的。

關係模型有一套複雜的數學理論,但是從概念上是十分容易理解的。舉個學校的例子:

假設某個XX省YY市ZZ縣第一實驗小學有3個年級,要表示出這3個年級,可以在Excel中用一個表格畫出來:

grade

每個年級又有若干個班級,要把所有班級表示出來,可以在Excel中再畫一個表格:

class

這兩個表格有個對映關係,就是根據Grade_ID可以在班級表中查詢到對應的所有班級:

grade-classes

也就是Grade表的每一行對應Class表的多行,在關係資料庫中,這種基於表(Table)的一對多的關係就是關係資料庫的基礎。

根據某個年級的ID就可以查詢所有班級的行,這種查詢語句在關係資料庫中稱為SQL語句,可以寫成:

SELECT * FROM classes WHERE grade_id = '1';

結果也是一個表:

---------+----------+----------
grade_id | class_id | name
---------+----------+----------
1        | 11       | 一年級一班
---------+----------+----------
1        | 12       | 一年級二班
---------+----------+----------
1        | 13       | 一年級三班
---------+----------+----------

類似的,Class表的一行記錄又可以關聯到Student表的多行記錄:

class-students

由於本教程不涉及到關係資料庫的詳細內容,如果你想從零學習關係資料庫和基本的SQL語句,請自行搜尋相關課程。

NoSQL

你也許還聽說過NoSQL資料庫,很多NoSQL宣傳其速度和規模遠遠超過關係資料庫,所以很多同學覺得有了NoSQL是否就不需要SQL了呢?千萬不要被他們忽悠了,連SQL都不明白怎麼可能搞明白NoSQL呢?

資料庫類別

既然我們要使用關係資料庫,就必須選擇一個關係資料庫。目前廣泛使用的關係資料庫也就這麼幾種:

付費的商用資料庫:

  • Oracle,典型的高富帥;

  • SQL Server,微軟自家產品,Windows定製專款;

  • DB2,IBM的產品,聽起來挺高階;

  • Sybase,曾經跟微軟是好基友,後來關係破裂,現在家境慘淡。

這些資料庫都是不開源而且付費的,最大的好處是花了錢出了問題可以找廠家解決,不過在Web的世界裡,常常需要部署成千上萬的資料庫伺服器,當然不能把大把大把的銀子扔給廠家,所以,無論是Google、Facebook,還是國內的BAT,無一例外都選擇了免費的開源資料庫:

  • MySQL,大家都在用,一般錯不了;

  • PostgreSQL,學術氣息有點重,其實挺不錯,但知名度沒有MySQL高;

  • sqlite,嵌入式資料庫,適合桌面和移動應用。

作為一個JavaScript全棧工程師,選擇哪個免費資料庫呢?當然是MySQL。因為MySQL普及率最高,出了錯,可以很容易找到解決方法。而且,圍繞MySQL有一大堆監控和運維的工具,安裝和使用很方便。

安裝MySQL

為了能繼續後面的學習,你需要從MySQL官方網站下載並安裝MySQL Community Server 5.6,這個版本是免費的,其他高階版本是要收錢的(請放心,收錢的功能我們用不上)。MySQL是跨平臺的,選擇對應的平臺下載安裝檔案,安裝即可。

安裝時,MySQL會提示輸入root使用者的口令,請務必記清楚。如果怕記不住,就把口令設定為password

在Windows上,安裝時請選擇UTF-8編碼,以便正確地處理中文。

在Mac或Linux上,需要編輯MySQL的配置檔案,把資料庫預設的編碼全部改為UTF-8。MySQL的配置檔案預設存放在/etc/my.cnf或者/etc/mysql/my.cnf

[client]
default-character-set = utf8

[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci

重啟MySQL後,可以通過MySQL的客戶端命令列檢查編碼:

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor...
...

mysql> show variables like '%char%';
+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | utf8                                                   |
| character_set_connection | utf8                                                   |
| character_set_database   | utf8                                                   |
| character_set_filesystem | binary                                                 |
| character_set_results    | utf8                                                   |
| character_set_server     | utf8                                                   |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/mysql-5.1.65-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+
8 rows in set (0.00 sec)

看到utf8字樣就表示編碼設定正確。

:如果MySQL的版本≥5.5.3,可以把編碼設定為utf8mb4utf8mb4utf8完全相容,但它支援最新的Unicode標準,可以顯示emoji字元。