數據庫的本質、概念及其應用實踐(一)

原文請詳見:http://www.ucai.cn/blogdetail/7033?mid=1&f=5php

可以在線執行查看效果哦!html


今天這堂課,分爲三個大點,正如標題所指出的,是討論數據的本質、概念與應用實踐。第一點本質的探討是站在一個更高的高度來分析數據的產生以及各類使用場景,而後將數據相關的存儲手段,做一個彙總解說。而概念,則是一個串講,主要放在關係數據庫上,因爲咱們六月份公開課,也將以關係型數據庫爲主。第三點就是經過一些實例來鞏固前面兩點所講的內容。mysql

 

1、數據庫的出現源起和本質redis


1.1 數據庫的起源sql

想像一下咱們的電腦,有文件夾,有文件,文件有大小,有位置,有格式,這個是有文件系統開始就有這個概念的,確定在有一個地方,存儲了這些文件的參數或者元數據,而在咱們的平常生活中,每一個物體和人,都有其各自不一樣的特徵,當一批量的這些可描寫敘述的人的特徵,想要數據化存儲起來的時候,也就需要有一種格式來保存。除了保存數據以外,咱們還得對數據進行管理。這就是數據庫出現的背景,並且隨着使用場景的越加複雜,數據庫自己也有了不少其它的衍生版本號。數據庫

因此數據庫起源於對數據的存儲以及管理。數組

 

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、數據庫有哪些概念

好的,聊完了數據以及相關軟件的一些使用場景,對於不一樣場景下使用不一樣軟件有了概念。如下咱們來介紹一下,在數據庫的領域常用的一些術語,這些術語,在咱們的整個數據庫學習中都要用到。

由於公開課的時間問題,咱們主要交流一下基本概念,對於高級的概念,後面的公開課會持續地講到。

 

2.1 數據庫的基本概念

介紹咱們如下數據庫的這些概念時,咱們以一個公司作爲對照。

2.1.一、庫

庫,就相對於一個公司,如下差點兒所有的概念都裝在這個公司裏的。

在使用數據庫以前,咱們得在數據庫軟件上建立數據庫。

在 MySQL 裏,同一個鏈接,僅僅能附着在同一個庫上,固然,僅僅要權限贊成,也可以實現跨庫查詢。

建立數據庫的語法是

 createdatabase xxx;

僅僅有root 用戶能建立庫。

 

2.1.二、表

表就相對於,公司的一個部門,這個部門管用戶,那個部門管訂單。就是一個又一個的表。

表由記錄和字段組成。

字段表成的是表定義。

記錄組成的是表數據。

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.三、視圖

視圖類就至關於虛擬的項目小組,可以是同一個部門出來的,也可以是跨部門的。

視圖之因此說是虛擬,因爲沒有實際存在的數據。無論是定義,仍是數據,都是從別的表裏組合起來的。

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.四、索引

索引就是至關於部門每個員工的一些用於高速找到員工的屬性。比方職位,比方愛好,比方畢業學校。經過這些,就能將部門的人分類,每一次查詢都能縮小結果集。

對錶建立索引是,比方仍是上面這個表, alter table hstesttbl add index(xxx);

 

2.1.五、鍵

鍵就至關於部門每個人的一些最快捷且惟一的聯絡方式,比方電話、郵箱,微信號,QQ號都是。

加入鍵跟加入索引,相似,刪除鍵這裏介紹一下,

比方:

alter table hstesttbl drop primary key;

 

2.1.六、權限

是指公司內部限制的一些紀律,比方公司外部人,是不能知道公司內部的一些事情的。

咱們可以經過

grantALL PRIVILEGES on dbname.* to 'user'@'127.0.0.1' identified by 'password' withgrant option;

這種語句給某用戶受權,全權訪問某個庫。這個這個用戶僅僅能訪問這個庫,在沒有得到不少其它受權的狀況下。

上面說僅僅有root用戶能建立數據庫,而對於上面的其它操做,比方建立表,加入視圖,新建、刪除索引和鍵,僅僅要通過了上面的受權,就可以作了。

 

2.1.七、SQL

SQL就至關於公司的一些規定,指令。比方咱們在公司裏交流說,可以公佈到生產環境了。聽起來一句簡單的話,包括着可能進行了產品確認,各類測試,可以由運維上線了。

SQL是咱們同數據庫打交道的指令。上面事實上在講各個概念時,已經都講過了一些SQL命令,我想這裏提幾個點。

手寫命令,很重要,優才網要求本身的學員都要有手寫命令的能力,不能離開phpmyadmin就沒有辦法幹活。

SQL上面雖然介紹了這麼多,咱們對它進行一個分類,事實上這個分類早有人作了。主要是爲DDL、DML、DCL(固然另外一個TCL,咱們今天不講)。

 

(1)數據定義。(SQL DDL)用於定義SQL模式、基本表、視圖和索引的建立和撤消操做。上面的,大可能是DDL。

(2)數據操縱。(SQL DML)數據操縱分紅數據查詢和數據更新兩類。數據更新又分紅插入、刪除、和改動三種操做。這就是咱們尋常所熟知的增刪改查操做。

(3)數據控制(DCL)。包含對基本表和視圖的受權,完整性規則的描寫敘述,事務控制等內容。這個就是咱們上面也有涉及,權限處理。

 

2.2 學術性的概念

•一、範式與冗餘

–第一範式,列不可以切割,比方興趣字段,它裏面,可能寫了籃球、電影等多項。原則上來說,這個表是不知足第一範式的。應該專門創建一個用戶興趣表,有uid和興趣。而後一我的有多條記錄。因此在數據庫字段定義時,需要顯式地指明數據類型,除了文本類型以外,你很是難往一個字段裏附加多個信息。

–第二範式,主鍵決定了其它全部屬性,比方一個班級學生表,一個學號,決定了學生其它的信息,比方有一個表,裏面有學號、學院編號、學生姓名、年齡、學院、院長。學號和學院編號是主鍵,看起來沒有錯,學生在這個學院編號裏,決定了哪一個學院,院長是誰誰誰。只是這是不知足第二範式的,因爲學院和院長不是由學號這個主鍵來決定的,而是由學院編號來決定的。因此要分拆。

–和三範式,其它屬性全由主鍵決定, 比方仍是上面這個表,裏面有學號、學院編號、學生姓名、年齡、學院、院長。學號是主鍵,看起來沒有錯,學生在這個學院裏,院長是誰誰誰。只是這是不知足第二範式的,因爲院長不是由學號這個主鍵來決定的,而是由學院來決定的。因此要分拆。

 

•二、ACID:

–原子性  (Atomicity) , 不可中間失敗。比方說,咱們買東西,一邊是買家付款,從買家帳戶扣除,還有一邊是存錢入賣家帳戶,這分了兩步,這不是原子的。因爲可能中間失敗。比方扣錢成功,存錢未成功。

–一致性(Consistency),仍是上面這個樣例,交易完畢後,數據一致,收支相抵。不能一邊多,一邊少。

–隔離性(Isolation),避免併發混亂,很是多數據,一個客戶訪問時沒有問題,多個用戶在高併發時訪問,也要知足數據不會錯亂。

–持久性(Durability),永久保存,就是不要丟失。不能一關機沒有了,即便丟一條也不成。

 

2.3 不少其它高級術語

一、存儲引擎 、事務、複合索引、鏈接池、備份、恢復

二、主從複製、行鎖定、表鎖定、慢查詢、二進制日誌、暫時表、內容分發、同步、數據庫分區、分庫、分表、水平拆分、垂直拆分

這不少其它的高級術語,咱們在後面再交流,或者在全棧project師課程中再交流。

相關文章
相關標籤/搜索