終于決定來談談數(shù)據(jù)庫(,簡稱DB)了。
其實我是忐忑
的,因為數(shù)據(jù)庫涉及的技術無論在廣度還是深度上都是空前的。一直以來很火的一個技術概念,大數(shù)據(jù)(Big Data)----從各種各樣類型的數(shù)據(jù)中快速獲取有價值信息數(shù)據(jù)庫中use的用法,其技術支撐就是數(shù)據(jù)庫。最簡單的理解,數(shù)據(jù)庫就像是你家的衣柜,怎么把你家大人、小朋友的四季的衣服分門別類的放到衣柜里,既能充分地利用衣柜的空間,又能快速地找到所需要的衣服,還能讓新買的衣服有合適的位置可放。
業(yè)界一個公認的說法:芯片、操作系統(tǒng)、數(shù)據(jù)庫是現(xiàn)代信息技術領域的三大核心基礎,所以,無論中興還是華為,這幾年為了不被卡脖子,可以明顯看到在這三大領域發(fā)力。在這三者中,從技術和工程難度來說,相對容易的是數(shù)據(jù)庫,相對單一。所以這幾年可以看到比如中興,自研的數(shù)據(jù)庫不斷在銀行等行業(yè)開始規(guī)模商用,無論在技術還是商業(yè)上可以說都取得了實質性的成功,反觀操作系統(tǒng),雖推出了產品,基本也只在內部產品使用;而芯片更加不可能依靠一家公司全搞定,比如中興微電子也只是負責芯片設計。
所以,以我一個無多少數(shù)據(jù)庫的實踐經(jīng)驗的小本科來說說數(shù)據(jù)庫,我想是2022年浙江衛(wèi)視音樂選秀類節(jié)目《中國好聲音》的梁靜茹導師給我的勇氣
。
一、初識數(shù)據(jù)庫 和數(shù)據(jù)庫最早的結緣是在上大學時期,一些小項目開發(fā)時需要用到數(shù)據(jù)庫,微軟在西工大有個微軟認證的考點,便去考了一個微軟的SQL 的數(shù)據(jù)庫管理員認證(MCDBA)
,相對系統(tǒng)地自學了一下數(shù)據(jù)庫的知識,初步建立了數(shù)據(jù)表、索引、主鍵、SQL語句、視圖、事務、存儲過程、觸發(fā)器等數(shù)據(jù)庫相關的概念。當時的直覺數(shù)據(jù)庫中use的用法,數(shù)據(jù)庫這玩意看起來技術更新沒有那么快
,或許可以當長期飯票,可惜事與愿違,人生的第一次面試給了ZTE后就只能在業(yè)余時間耍耍DB了
。 一個完整的數(shù)據(jù)庫系統(tǒng)一般由數(shù)據(jù)庫(DB)、數(shù)據(jù)庫管理系統(tǒng)(DBMS)、應用開發(fā)工具、應用系統(tǒng)、數(shù)據(jù)庫管理員和用戶組成:
1)數(shù)據(jù)庫:用于存儲數(shù)據(jù)的地方。 數(shù)據(jù)庫(,DB)提供了一個存儲空間來存儲各種數(shù)據(jù),可以將數(shù)據(jù)庫視為一個存儲數(shù)據(jù)的容器。一個數(shù)據(jù)庫可能包含許多文件,一個數(shù)據(jù)庫系統(tǒng)中通常包含許多數(shù)據(jù)庫。 可以理解成你家的多個衣柜。 2)數(shù)據(jù)庫管理系統(tǒng):用于管理數(shù)據(jù)庫的軟件。 數(shù)據(jù)庫管理系統(tǒng)( ,DBMS)是用戶創(chuàng)建、管理和維護數(shù)據(jù)庫時所使用的軟件,位于用戶和操作系統(tǒng)之間,對數(shù)據(jù)庫進行統(tǒng)一管理。DBMS 能定義數(shù)據(jù)存儲結構,提供數(shù)據(jù)的操作機制,維護數(shù)據(jù)庫的安全性、完整性和可靠性。 可以理解成統(tǒng)一由你家的女主人來管理衣柜,要是你哪天自作主張地在衣柜里鼓搗,迎接你的就是羞羞的粉拳
。 3)數(shù)據(jù)庫應用程序:為了提高數(shù)據(jù)庫系統(tǒng)的處理能力所使用的管理數(shù)據(jù)庫庫的軟件補充。 雖然已經(jīng)有了 DBMS,但是在很多情況下,DBMS 無法滿足對數(shù)據(jù)管理的要求。數(shù)據(jù)庫應用程序( )的使用可以滿足對數(shù)據(jù)管理的更高要求,還可以使數(shù)據(jù)管理過程更加直觀和友好。數(shù)據(jù)庫應用程序負責與 DBMS 進行通信、訪問和管理 DBMS 中存儲的數(shù)據(jù),允許用戶插入、修改、刪除數(shù)據(jù)庫中的數(shù)據(jù)。 可以理解成萬一你家女主人不在,她給了你一本小冊子,告訴你在哪個衣柜的哪個位置可以找到哪件衣服,洗干凈了又該放哪里。
二、當前主要數(shù)據(jù)庫類型
1)傳統(tǒng)的關系型數(shù)據(jù)庫 一般也叫SQL數(shù)據(jù)庫,關系型數(shù)據(jù)庫是應用最廣泛的數(shù)據(jù)庫。關系型數(shù)據(jù)庫在 1969 年誕生,可謂歷史悠久。和 Excel 工作表一樣,關系型數(shù)據(jù)庫也采用由行和列組成的二維表來管理數(shù)據(jù),所以簡單易懂。同時,它還使用 SQL( Query ,結構化查詢語言)對數(shù)據(jù)進行操作。常見的關系型數(shù)據(jù)庫如、MySQL、、,前三個都是功能齊全的大型數(shù)據(jù)庫,是一個開源、輕型、無需專門服務器、零配置的小型數(shù)據(jù)庫,一個數(shù)據(jù)庫就只是一個文件,在應用程序內執(zhí)行操作,占用資源小,可用于嵌入式或小型應用。
2)非關系型數(shù)據(jù) 一般也叫NoSQL數(shù)據(jù)庫,NoSQL是指Not only SQL的意思。常見NoSQL數(shù)據(jù)如,Redis等。 隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關系數(shù)據(jù)庫在應付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題,而非關系型的數(shù)據(jù)庫則由于其本身的特點得到了非常迅速的發(fā)展。NoSql數(shù)據(jù)庫在特定的場景下可以發(fā)揮出難以想象的高效率和高性能
,它是作為對傳統(tǒng)關系型數(shù)據(jù)庫的一個有效的補充。神馬意思呢?For ,微博熱搜中的某博文可能同時有幾百萬或者更多的人在看或者轉發(fā)、評論,其閱讀數(shù)、轉發(fā)數(shù)、評論數(shù)等如何實時更新?如果用傳統(tǒng)數(shù)據(jù)庫,一個用戶的操作就需要進行某行某列,這么大的并發(fā)數(shù),性能再強悍的關系型數(shù)據(jù)庫也只能說,“臣妾真的做不到啊”
,為了迎合互聯(lián)網(wǎng)的這種需求,于是NoSQL數(shù)據(jù)庫粉墨登場了
。
NoSQL數(shù)據(jù)庫并沒有一個統(tǒng)一的架構,兩種不同的NoSQL數(shù)據(jù)庫之間的差異程度,遠遠超過兩種關系型數(shù)據(jù)庫之間的不同
。NoSQL數(shù)據(jù)庫各有所長,一個優(yōu)秀的NoSQL數(shù)據(jù)庫必然特別適用于某些場合或者某些應用,在這些場合中會遠遠勝過關系型數(shù)據(jù)庫和其他的NoSQL 數(shù)據(jù)庫。常見的 NoSQL 數(shù)據(jù)庫包括鍵值數(shù)據(jù)庫、列族數(shù)據(jù)庫、文檔數(shù)據(jù)庫和圖形數(shù)據(jù)庫,其具體分類和特點如下表所示:
分類
相關產品
應用場景
數(shù)據(jù)模型
優(yōu)點
缺點
鍵值數(shù)據(jù)庫
Redis、、Riak
內容緩存(如會話)、頻繁讀寫、擁有簡單數(shù)據(jù)模型的應用
鍵值對,通過散列表來實現(xiàn)
擴展性好,靈活性好,大量操作時性能高
數(shù)據(jù)無結構化,通常只被當做字符串或者二進制數(shù)據(jù),只能通過鍵來查詢值
列族數(shù)據(jù)庫
、HBase、
分布式數(shù)據(jù)存儲與管理
以列族式存儲,將同一列數(shù)據(jù)存在一起
可擴展性強,查找速度快,復雜性低
功能局限,不支持事務的強一致性
文檔數(shù)據(jù)庫
、
Web應用,存儲面向文檔或類似半結構化的數(shù)據(jù)
value是JSON結構的文檔
數(shù)據(jù)結構靈活,可以根據(jù) value 構建索引
缺乏統(tǒng)一查詢語法
圖形數(shù)據(jù)庫
Neo4j、
社交網(wǎng)絡、推薦系統(tǒng),專注構建關系圖譜
圖結構
支持復雜的圖形算法
復雜性高,只能支持一定的數(shù)據(jù)規(guī)模
a.鍵值存儲數(shù)據(jù)庫(key-value) 鍵值數(shù)據(jù)庫就類似傳統(tǒng)語言中使用的哈希表。可以通過key來添加、查詢或者刪除數(shù)據(jù)庫,因為使用key主鍵訪問,所以會獲得很高的性能及擴展性。值數(shù)據(jù)庫主要使用一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù)。Key/value模型對于IT系統(tǒng)來說的優(yōu)勢在于簡單、易部署、高并發(fā)。
b.列存儲(-)數(shù)據(jù)庫 列存儲數(shù)據(jù)庫將數(shù)據(jù)存儲在列族中,一個列族存儲經(jīng)常被一起查詢的相關數(shù)據(jù),比如人類,我們經(jīng)常會查詢某個人的姓名和年齡,而不是薪資。這種情況下姓名和年齡會被放到一個列族中,薪資會被放到另一個列族中。 這種數(shù)據(jù)庫通常用來應對分布式存儲海量數(shù)據(jù),鍵仍然存在,但是它們的特點是指向了多個列。
c.面向文檔(-)數(shù)據(jù)庫 文檔型數(shù)據(jù)庫的靈感是來自于Lotus Notes辦公軟件,而且它同第一種鍵值數(shù)據(jù)庫類似。該類型的數(shù)據(jù)模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數(shù)據(jù)庫可以看作是鍵值數(shù)據(jù)庫的升級版,允許之間嵌套鍵值,而且文檔型數(shù)據(jù)庫比鍵值數(shù)據(jù)庫的查詢效率更高。
d.圖形數(shù)據(jù)庫 圖形數(shù)據(jù)庫允許我們將數(shù)據(jù)以圖的方式存儲。圖形數(shù)據(jù)庫來源于圖論中的拓撲學,以節(jié)點、邊及節(jié)點之間的關系來存儲復雜網(wǎng)絡中的數(shù)據(jù)。實體會被作為頂點,而實體之間的關系則會被作為邊。比如我們有三個實體,Steve Jobs、Apple和Next,則會有兩個“ by”的邊將Apple和Next連接到Steve Jobs。
3)如果從數(shù)據(jù)庫應用角度來區(qū)分,數(shù)據(jù)庫還可以分為面向操作型(OLTP:On-Line ,比如實時的信用卡交易)和面向數(shù)據(jù)分析型(OLAP:On-Line ),結合數(shù)據(jù)庫的兩種分類,就有四種組合,對比如下:
數(shù)據(jù)庫
應用場景
典型DB產品
優(yōu)點
缺點
面向操作的關系型數(shù)據(jù)庫
ERP,CRM,信用卡交易,中小型電商
,,Mysql
完善的生態(tài)環(huán)境保護,事務保證/數(shù)據(jù)一致性
嚴苛的數(shù)據(jù)模型界定,數(shù)據(jù)庫拓展限制,和非結構型的結合應用較難
面向數(shù)據(jù)分析的關系型數(shù)據(jù)庫
數(shù)據(jù)倉庫,商務智能,數(shù)據(jù)科學研究
, ,,
信息內容和計算的一致性
必須由數(shù)據(jù)庫技術專業(yè)的IT工作人員維護保養(yǎng),數(shù)據(jù)相應通常是分鐘級
面向操作的非關系型數(shù)據(jù)庫
Web,移動應用,社交網(wǎng)絡,用戶推進,購物籃
, ,Redis
便捷性,協(xié)調能力(不用預定義的方式),水平伸縮(適應大規(guī)模數(shù)據(jù)量),成本低(開源系統(tǒng))
欠缺事務保證
面向數(shù)據(jù)分析的非關系型數(shù)據(jù)庫
索引數(shù)以百萬計的數(shù)據(jù)點,預測分析
,,MapR,,,,
適用批量處理,并行處理文件;主要是開源的,資金投入較低
遲緩的響應速度;不宜迅速檢索或高速更新
看暈了嗎?其實核心意思就是數(shù)據(jù)庫的選型,需要由架構師根據(jù)具體的使用場景來選擇。對一般中小型項目使用來說,Mysql/Redis基本都可以應付了
。 云計算發(fā)展起來后,數(shù)據(jù)庫也進入了一個新的發(fā)展階段,各大型云服務商都提供了數(shù)據(jù)庫實例,可以方便地快速完成數(shù)據(jù)庫的部署
。下面我們就來無成本拉一個Mysql和Redis實例。三、無成本獲得一個redis實例方法 redis是一個高性能的 key-value 的內存數(shù)據(jù)庫,它的key為字符串型(),value則是多種多樣,如字符串型()、哈希(hash)、列表(list)、集合(set)、有序集合(sort set)等。通過redis-cli客戶端登錄到redis服務端后(登錄成功后出現(xiàn) > 提示符),可對key進行各種操作。比如,對字符串類型(注意: 類型是二進制安全的,意思是 redis 的 可以包含任何數(shù)據(jù)),set賦值后,如果是數(shù)字類型,可進行加1或減一(這種方法對如web的類似訪問次數(shù)的快速更新非常高效),代碼示例如下:
SET page_view 20
OK
redis> INCR page_view
(integer) 21
redis> GET page_view # 數(shù)字值在 Redis 中以字符串的形式保存
"21"
redis的不同類型的value,需要用不同指令進行操作,字符串型的如GET、SET、INCR、DECR,哈希類型的HMSET、HMGET,列表類型的LPUSH、LPOP、LSET,集合類型的SADD、等。比如,在redis中定義key名稱為poems的、類型為集合的鍵值對,使用SADD中依次加入唐詩宋詞,然后用隨機取一篇詩歌。 下面我們無成本來拉一個redis實例:
用任何一個現(xiàn)代瀏覽器訪問:,這個網(wǎng)站提供了30M大小(其實能存儲不少東西了)、同時30個連接、部署在AWS等公有云上的免費redis數(shù)據(jù)庫實例
,點擊"start for free":
用郵箱注冊、再選擇個數(shù)據(jù)中心選個名字,就能拉一個redis實例出來了:
記錄好默認密碼,點擊頁面的的Copy按鈕,可以查到數(shù)據(jù)庫從公網(wǎng)訪問的主機名和端口號(copy后可黏貼到寫字板,得到的結果類似redis-18943.c1.:18943):
然后可以用redis-cli客戶端登錄(linux下指令redis-cli -h 主機名 -p 端口號 -a 密碼),在redis-cli交互界面下,輸入info可以查詢redis數(shù)據(jù)庫的基本信息:
輸入keys * 可輸出當前數(shù)據(jù)庫的所有key名稱:
完整的redis指令用法可自行baidu,特別提一下的是,批處理的辦法是:首先編寫好批處理腳本,然后用: cat 批處理腳本文件名 | redis-cli -h redis服務器名-p 端口號-a "密碼" 調用即可,如 :
cat?init.txt?|?redis-cli?-h?redis-ec2.redislabs.com?-p?18943?-a?"1234"?
四、無成本獲得一個mysql實例方法
mysql是一個開源的關系型大型數(shù)據(jù)庫,所謂關系型,就是它的主要操作對象是表,對,就是平常我們用的excel,行和列,簡單理解就是一個增強型的excel表,行數(shù)、列數(shù)、查詢和更新速度都大幅提升,mysql也支持標準的SQL語句。常見的mysql指令: mysql -h 主機地址 -P 端口號-u 用戶名 -p 用戶密碼:登錄MySQL服務器: name:創(chuàng)建數(shù)據(jù)庫 use :選擇數(shù)據(jù)庫 drop name :直接刪除數(shù)據(jù)庫,不提醒 show :顯示表 :表的詳細描述 table:創(chuàng)建表 into:向表中插入數(shù)據(jù) xx,xx from table where 條件:查詢表(語句很有講究) 下面我們無成本來拉一個mysql實例:
用任何一個現(xiàn)代瀏覽器訪問:,這個網(wǎng)站提供了10M大小、無連接數(shù)限制、無流量限制的mysql免費實例
。用郵箱注冊后,在頁面中,點擊“New ”
在數(shù)據(jù)庫創(chuàng)建頁面中,選擇數(shù)據(jù)庫引擎為mysql、填一個數(shù)據(jù)庫名稱,就能立馬拉一個mysql實例出來了:
創(chuàng)建好后,可在數(shù)據(jù)庫的具體信息頁面上看到數(shù)據(jù)庫的詳細登錄信息:
然后就可以用mysql客戶端登錄并執(zhí)行sql語句了,
一些高級點的用法,如索引怎么設計和創(chuàng)建、觸發(fā)器怎么設計和創(chuàng)建、視圖怎么設計和創(chuàng)建.......,可自行baidu進行練習、測試和體驗,這里不再贅述。特別提一下的是,批處理的辦法是:首先編寫好批處理腳本,然后用: mysql -h 主機地址 -P 端口號-u 用戶名 -p 用戶密碼