原文請詳見: http://www.ucai.cn/blogdetail/7033?mid=1&f=5
能夠在線執行查看效果哦!
今天這堂課,分為三個大點,正如標題所指出的,是討論數據的本質、概念與應用實踐。第一點本質的探討是站在一個更高的高度來分析數據的產生以及各種使用場景,然后將數據相關的存儲手段,作一個匯總解說。而概念,則是一個串講,主要放在關系數據庫上,由于我們六月份公開課,也將以關系型數據庫為主。第三點就是通過一些實例來鞏固前面兩點所講的內容。
?
一、數據庫的出現源起和本質
1.1 數據庫的起源
想像一下我們的電腦,有文件夾,有文件,文件有大小,有位置,有格式,這個是有文件系統開始就有這個概念的,肯定在有一個地方,存儲了這些文件的參數或者元數據,而在我們的日常生活中,每個物體和人,都有其各自不同的特征,當一批量的這些可描寫敘述的人的特征,想要數據化存儲起來的時候,也就須要有一種格式來保存。除了保存數據之外,我們還得對數據進行管理。這就是數據庫出現的背景,而且隨著使用場景的越加復雜,數據庫本身也有了很多其它的衍生版本號。
所以數據庫起源于對數據的存儲以及管理。
?
1.2數據庫的使用場景
那么我們有幾個問題,基于大家眼下的理解,第一個問題是有哪些須要保存的數據種類,有哪些存儲方式呢?我們發散一點來想。
?
能夠得到例如以下的情況:
A、在程序中自己定義,比方數組,僅僅保存在內存里,等程序停止了之后,數據就沒有了。這樣能夠不能夠?
在這個里面存儲的反正是描寫敘述型數據,也能夠是二進制數組。?
B、保存在一個文本文件中能夠不能夠,有自己的格式,比方自己定義的格式,比方XML,比方JSON格式
這里保存的,僅僅能是描寫敘述型數據。
C、採用一些文件型數據庫,比方支持SQL訪問的文本數據庫,比方Sqlite、比方Access
除了特定的數據類型,一般也僅僅保存文本描寫敘述數據。
D、採用 MySQL 這樣基于網絡和可分布式的數據庫系統。
用來保存較多數據量的用戶數據、關系數據、交易數據,這些數據要實再高速查詢更新。
E、當數據量大時,一臺設備就不能滿足要求,這就須要用到分布式數據庫,可能是數據集群。?
F、採用 memcached 這種軟件保存著緩存的數據。
一般用于保存文本數據或者計數。
G、採用 fastdfs 這種分布式文件系統來保存著文件數據。
不用于保存除文件本身描寫敘述之外的其它描寫敘述數據,用于保存大量的文件。
H、採用redis 這種KVDB 軟件來保存簡單關系的描寫敘述數據,或者特定的結構。
比方用于保存微博數據,用KEY能夠迅速定位到微博內容。?
I、同KVDB類似的,大家有聽過隊列那幾講的同學嗎?是不是也是特殊的數據存儲手段呢?一邊有人生產數據,一邊有人消費數據。?
J、用于保存地理關系數據,并提供運算。在英文里叫SpatialData,也就是空間數據。Oracle最擅長,如今MySQL也有空間擴展。
http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html
K、而對于大量的,源源不斷的海量數據,相對不那么規則的數據存儲,我們可能存儲在Hadoop系統中。
L、最后再談一個場景,像百度這種搜索引擎,他會把他的數據全放在MySQL里,然后去檢索嗎?顯然不是。有自有的索引格式和支持分布式查詢的系統。
?
1.3數據庫場景以及分類總結
總結一下:
A、在電腦時代曾經,人類就產生了大量的信息,而電腦時代以來,更是產生了大量的數字化的數據。而這些數據庫的保存的形式,從上面能夠看到,根據不同的場景,不同的保存方式,是多種多樣的。有僅在內存中保存,有在文件里保存,有專用嚴謹的數據庫系統保存,也有不那么嚴謹的KVDB保存。?
B、依據上面的各種存儲場景,我們對數據,也做兩個簡單的分類,一個是結構化數據庫和非結構化數據的分類,當然,還有再加一種半結構化數據的。所謂結構化,就是非常規整地有屬性的一種情況。像一個人,他有身高、體重、年齡,這個描寫敘述是結構化的,你給照一張照片,錄一段聲音,拍一段攝像,雖然這也是數據,可是不是結構化的。對于不同的這兩類數據,存儲方式也不同樣,比方結構化數據是典型的二維表的結構。而非結構化數據就是僅僅以原始數據的形式存儲。
上面的場景,大多是結構化數據的處理場景,像文本數據庫、MySQL數據庫。而在fastdfs上,Hadoop上,就有大量的非結構化數據的存儲。?
C、依據數據量本身的大小,我們也能夠做一個分類。或者特定的技術應用場景。
比方小數據量數據,我們可能為了方便,就以文本的方式來保存。而對于一個正規的提供服務的站點,像用戶數據,比方優才網的用戶數據,就會用MySQL數據庫來保存,為了訪問速度,也會用到memcached這種緩存軟件。也會用fastdfs來保存小文件。而當有大量的日志等數據量產生,須要進行數據分析的時候,比方每天的數據量以幾百G,T來計的時候,就會用Hadoop 這種軟件。
所以,不同的數據量也使用不同的保存方式。小型數據、大中型數據、海量數據或者大數據。
D、第四個角度就是從上面能夠看出,數據的存儲方式,有非常多類別,不同類別適用于不同的場景。數據庫是非常強大的,可是不是全部的場景都合適使用數據庫。比方上面講的全文檢索的場景,一般須要用特定的存儲,特定的索引方式。假設詳細地講,全文檢索中,使用的一種索引,叫倒排索引。
?
二、數據庫有哪些概念
好的,聊完了數據以及相關軟件的一些使用場景,對于不同場景下使用不同軟件有了概念。以下我們來介紹一下,在數據庫的領域經常使用的一些術語,這些術語,在我們的整個數據庫學習中都要用到。
因為公開課的時間問題,我們主要交流一下基本概念,對于高級的概念,后面的公開課會持續地講到。
?
2.1 數據庫的基本概念
介紹我們以下數據庫的這些概念時,我們以一個公司做為對照。
2.1.1、庫
庫,就相對于一個公司,以下差點兒全部的概念都裝在這個公司里的。
在使用數據庫之前,我們得在數據庫軟件上創建數據庫。
在 MySQL 里,同一個連接,僅僅能附著在同一個庫上,當然,僅僅要權限同意,也能夠實現跨庫查詢。
創建數據庫的語法是
?createdatabase xxx;
僅僅有root 用戶能創建庫。
?
2.1.2、表
表就相對于,公司的一個部門,這個部門管用戶,那個部門管訂單。就是一個又一個的表。
表由記錄和字段組成。
字段表成的是表定義。
記錄組成的是表數據。
CREATE TABLE `hstesttbl` ( `k` int(11)NOT NULL AUTO_INCREMENT, `v`char(255) NOT NULL DEFAULT '', PRIMARY KEY(`k`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
字段定義則有字段名,字段類型,是否為空,是否自增長,缺省值等。
記錄則是實際的數據值,同一個表的記錄的定義都是一樣的。也就是說有同樣的特征。
?
2.1.3、視圖
視圖類就相當于虛擬的項目小組,能夠是同一個部門出來的,也能夠是跨部門的。
視圖之所以說是虛擬,由于沒有實際存在的數據。不管是定義,還是數據,都是從別的表里組合起來的。
create view hsview as select * from hstesttbl; mysql> show tables; +--------------------+ | Tables_in_hstestdb | +--------------------+ | hstesttbl | | hsview | +--------------------+ 2 rows in set (0.02 sec) mysql> show create table hsview\G; *************************** 1. row*************************** View: hsview Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQLSECURITY DEFINER VIEW `hsview` AS select `hstesttbl`.`k` AS `k`,`hstesttbl`.`v`AS `v` from `hstesttbl`
從上面的命令能夠看出,視圖跟表的操作有非常多相似。而且從表到視圖還能改動字段名。
?
2.1.4、索引
索引就是相當于部門每一個員工的一些用于高速找到員工的屬性。比方職位,比方愛好,比方畢業學校。通過這些,就能將部門的人分類,每一次查詢都能縮小結果集。
對表創建索引是,比方還是上面這個表, alter table hstesttbl add index(xxx);
?
2.1.5、鍵
鍵就相當于部門每一個人的一些最快捷且唯一的聯絡方式,比方電話、郵箱,微信號,QQ號都是。
加入鍵跟加入索引,類似,刪除鍵這里介紹一下,
比方:
alter table hstesttbl drop primary key;
?
2.1.6、權限
是指公司內部限制的一些紀律,比方公司外部人,是不能知道公司內部的一些事情的。
我們能夠通過
grantALL PRIVILEGES on dbname.* to 'user'@'127.0.0.1' identified by 'password' withgrant option;
這種語句給某用戶授權,全權訪問某個庫。這個這個用戶僅僅能訪問這個庫,在沒有獲得很多其它授權的情況下。
上面說僅僅有root用戶能創建數據庫,而對于上面的其它操作,比方創建表,加入視圖,新建、刪除索引和鍵,僅僅要經過了上面的授權,就能夠做了。
?
2.1.7、SQL
SQL就相當于公司的一些規定,指令。比方我們在公司里交流說,能夠公布到生產環境了。聽起來一句簡單的話,包括著可能進行了產品確認,各種測試,能夠由運維上線了。
SQL是我們同數據庫打交道的指令。上面事實上在講各個概念時,已經都講過了一些SQL命令,我想這里提幾個點。
手寫命令,很重要,優才網要求自己的學員都要有手寫命令的能力,不能離開phpmyadmin就沒有辦法干活。
SQL上面雖然介紹了這么多,我們對它進行一個分類,事實上這個分類早有人做了。主要是為DDL、DML、DCL(當然另一個TCL,我們今天不講)。
?
(1)數據定義。(SQL DDL)用于定義SQL模式、基本表、視圖和索引的創建和撤消操作。上面的,大多是DDL。
(2)數據操縱。(SQL DML)數據操縱分成數據查詢和數據更新兩類。數據更新又分成插入、刪除、和改動三種操作。這就是我們尋常所熟知的增刪改查操作。
(3)數據控制(DCL)。包含對基本表和視圖的授權,完整性規則的描寫敘述,事務控制等內容。這個就是我們上面也有涉及,權限處理。
?
2.2 學術性的概念
?1、范式與冗余
–第一范式,列不能夠切割,比方興趣字段,它里面,可能寫了籃球、電影等多項。原則上來講,這個表是不滿足第一范式的。應該專門建立一個用戶興趣表,有uid和興趣。然后一個人有多條記錄。所以在數據庫字段定義時,須要顯式地指明數據類型,除了文本類型之外,你非常難往一個字段里附加多個信息。
–第二范式,主鍵決定了其它所有屬性,比方一個班級學生表,一個學號,決定了學生其它的信息,比方有一個表,里面有學號、學院編號、學生姓名、年齡、學院、院長。學號和學院編號是主鍵,看起來沒有錯,學生在這個學院編號里,決定了哪個學院,院長是誰誰誰。只是這是不滿足第二范式的,由于學院和院長不是由學號這個主鍵來決定的,而是由學院編號來決定的。所以要分拆。
–和三范式,其它屬性全由主鍵決定, 比方還是上面這個表,里面有學號、學院編號、學生姓名、年齡、學院、院長。學號是主鍵,看起來沒有錯,學生在這個學院里,院長是誰誰誰。只是這是不滿足第二范式的,由于院長不是由學號這個主鍵來決定的,而是由學院來決定的。所以要分拆。
?
?2、ACID:
–原子性? (Atomicity) , 不可中間失敗。比方說,我們買東西,一邊是買家付款,從買家賬戶扣除,還有一邊是存錢入賣家賬戶,這分了兩步,這不是原子的。由于可能中間失敗。比方扣錢成功,存錢未成功。
–一致性(Consistency),還是上面這個樣例,交易完畢后,數據一致,收支相抵。不能一邊多,一邊少。
–隔離性(Isolation),避免并發混亂,非常多數據,一個客戶訪問時沒有問題,多個用戶在高并發時訪問,也要滿足數據不會錯亂。
–持久性(Durability),永久保存,就是不要丟失。不能一關機沒有了,即使丟一條也不成。
?
2.3 很多其它高級術語
1、存儲引擎 、事務、復合索引、連接池、備份、恢復
2、主從復制、行鎖定、表鎖定、慢查詢、二進制日志、暫時表、內容分發、同步、數據庫分區、分庫、分表、水平拆分、垂直拆分
這很多其它的高級術語,我們在后面再交流,或者在全棧project師課程中再交流。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
