不懂NOSQL這些知識(shí), 怎么吹牛B

NOSQL這個(gè)概念其實(shí)唱了好多好多年了,但是真正浸淫其中, 理解深刻并享受到紅利的人占比其實(shí)并不高系草。

近期筆者自己會(huì)在大數(shù)據(jù)通熄、圖數(shù)據(jù)等方面邊學(xué)習(xí)邊記錄一些筆記,持續(xù)分享自己的心得體會(huì)找都,此文權(quán)當(dāng)發(fā)力之前的開(kāi)山篇唇辨,希望更多關(guān)心該領(lǐng)域的朋友多多關(guān)注、支持和幫助能耻。


NOSQL的概念

剛剛出現(xiàn)NOSQL這個(gè)概念的時(shí)候赏枚,很多人都是似而非的字面理解成"不是SQL", 與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)是兩個(gè)完全獨(dú)立的陣營(yíng)晓猛,實(shí)際上完全不是這么回事饿幅。個(gè)人更傾向于理解NOSQL的誕生更多的是為了補(bǔ)充關(guān)系型數(shù)據(jù)庫(kù)的短板,滿足現(xiàn)下互聯(lián)網(wǎng)海量數(shù)據(jù)戒职、高并發(fā)栗恩、低延遲和非結(jié)構(gòu)化數(shù)據(jù)易擴(kuò)展等需求。

NoSQL = Not Only SQL洪燥,意即“不僅僅是SQL”磕秤,是對(duì)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)管理系統(tǒng)的統(tǒng)稱乳乌。與關(guān)系型數(shù)據(jù)庫(kù)相比,它們?cè)诩軜?gòu)和數(shù)據(jù)模型方面做了“減法”市咆,而在擴(kuò)展和并發(fā)等方面做了“加法”汉操。

NOSQL簡(jiǎn)史

NoSQL一詞最早出現(xiàn)于1998年,是Carlo Strozzi開(kāi)發(fā)的一個(gè)輕量蒙兰、開(kāi)源磷瘤、不提供SQL功能的關(guān)系數(shù)據(jù)庫(kù)。

2009年搜变,Last.fm的Johan Oskarsson發(fā)起了一次關(guān)于分布式開(kāi)源數(shù)據(jù)庫(kù)的討論采缚,來(lái)自Rackspace的Eric Evans再次提出了NoSQL的概念,這時(shí)的NoSQL主要指非關(guān)系型挠他、分布式仰担、不提供ACID的數(shù)據(jù)庫(kù)設(shè)計(jì)模式。

2009年在亞特蘭大舉行的"no:sql(east)"討論會(huì)是一個(gè)里程碑绩社,其口號(hào)是"select fun, profit from real_world where relational=false;"。因此赂苗,對(duì)NoSQL最普遍的解釋是"非關(guān)聯(lián)型的"愉耙,強(qiáng)調(diào)Key-Value Stores和文檔數(shù)據(jù)庫(kù)的優(yōu)點(diǎn),而不是單純的反對(duì)RDBMS拌滋。

為何要使用NoSQL

NoSQL具有靈活的數(shù)據(jù)模型朴沿,可以處理非結(jié)構(gòu)化/半結(jié)構(gòu)化的大數(shù)據(jù)

NoSQL很容易實(shí)現(xiàn)可伸縮性(向上擴(kuò)展與水平擴(kuò)展)

NoSQL在不太影響性能的情況,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)

NoSQL數(shù)據(jù)庫(kù)都具有非常高的讀寫(xiě)性能败砂,尤其在大數(shù)據(jù)量下赌渣,同樣表現(xiàn)優(yōu)秀。這得益于它的無(wú)關(guān)系性昌犹,數(shù)據(jù)庫(kù)的結(jié)構(gòu)簡(jiǎn)單坚芜。

NOSQL的分類

主流的NoSQL數(shù)據(jù)庫(kù)主要分為4類:

鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫(kù)

這一類數(shù)據(jù)庫(kù)主要會(huì)使用到一個(gè)哈希表,這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)斜姥。Key/value模型對(duì)于IT系統(tǒng)來(lái)說(shuō)的優(yōu)勢(shì)在于簡(jiǎn)單鸿竖、易部署。但是如果DBA只對(duì)部分值進(jìn)行查詢或更新的時(shí)候铸敏,Key/value就顯得效率低下了缚忧。例如:Redis,Memcache, DynamoDB等

列存儲(chǔ)(Wide-Column)數(shù)據(jù)庫(kù)

這部分?jǐn)?shù)據(jù)庫(kù)通常是用來(lái)應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù)。鍵仍然存在杈笔,但是它們的特點(diǎn)是指向了多個(gè)列闪水。這些列是由列家族來(lái)安排的。如:Cassandra, HBase蒙具。

文檔型(Document)數(shù)據(jù)庫(kù)

文檔型數(shù)據(jù)庫(kù)的靈感是來(lái)自于Lotus Notes辦公軟件的球榆,而且它同第一種鍵值存儲(chǔ)相類似朽肥。該類型的數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲(chǔ)芜果,比如JSON鞠呈。文檔型數(shù)據(jù)庫(kù)可 以看作是鍵值數(shù)據(jù)庫(kù)的升級(jí)版,允許之間嵌套鍵值右钾。而且文檔型數(shù)據(jù)庫(kù)比鍵值數(shù)據(jù)庫(kù)的查詢效率更高蚁吝。如:CouchDB, MongoDB。

圖形(Graph)數(shù)據(jù)庫(kù)

圖形結(jié)構(gòu)的數(shù)據(jù)庫(kù)同其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫(kù)不同舀射,它是使用靈活的圖形模型窘茁,并且能夠擴(kuò)展到多個(gè)服務(wù)器上。NoSQL數(shù)據(jù)庫(kù)沒(méi)有標(biāo)準(zhǔn)的查詢語(yǔ)言(SQL)脆烟,因此進(jìn)行數(shù)據(jù)庫(kù)查詢需要制定數(shù)據(jù)模型山林。許多NoSQL數(shù)據(jù)庫(kù)都有REST式的數(shù)據(jù)接口或者查詢API。 如:OrientDB, Neo4J, Titan等邢羔。

其他還有類似對(duì)象數(shù)據(jù)庫(kù)驼抹,XML數(shù)據(jù)庫(kù)大家自行搜索吧。另外很多NOSQL數(shù)據(jù)庫(kù)其實(shí)是支持多模型的拜鹤,比如OrientDB同時(shí)支持Key-Value, Document, Graph, Object數(shù)據(jù)庫(kù)框冀。

更多NOSQL數(shù)據(jù)庫(kù)列表請(qǐng)看

http://nosql-database.org/

十萬(wàn)個(gè)為什么

列數(shù)據(jù)庫(kù)到底牛逼在哪里

其實(shí)應(yīng)該這么說(shuō),列數(shù)據(jù)庫(kù)只有在OLAP,或者說(shuō)對(duì)部分列進(jìn)行聚合操作的場(chǎng)景下, 比如sum敏簿、count明也、groupby之類的運(yùn)算,它確實(shí)優(yōu)秀惯裕。但是如果是OLTP温数,大量的更新或者大量的整行查詢,那列數(shù)據(jù)庫(kù)沒(méi)有優(yōu)勢(shì)蜻势,甚至反而會(huì)比RDBMS更慢撑刺。

列數(shù)據(jù)庫(kù)的存儲(chǔ)方式與行數(shù)據(jù)庫(kù)也有顯著不同:行式存儲(chǔ)中,主鍵是rowid咙边,由它關(guān)聯(lián)到索引數(shù)據(jù)猜煮;列式存儲(chǔ)中,主鍵是數(shù)據(jù)本身败许,關(guān)聯(lián)回rowid王带,即“數(shù)據(jù)即索引”。

這里有個(gè)對(duì)比的paper, 有興趣的可以讀一下

http://db.csail.mit.edu/projects/cstore/abadi-sigmod08.pdf

列存儲(chǔ) vs 行存儲(chǔ) WIKI

https://en.wikipedia.org/wiki/Column-oriented_DBMS

文檔DB?VS鍵值DB

它倆的主要區(qū)別簡(jiǎn)單一句話市殷,就是:鍵值DB不知道Value的格式和內(nèi)容愕撰,而文檔DB知道且可以在格式化的Value內(nèi)容(Json/XML)上建立索引進(jìn)行查詢。

我是不是說(shuō)的挺明白的?

圖DB做社交關(guān)系為什么快

我們就以社交網(wǎng)絡(luò)為例搞挣,來(lái)簡(jiǎn)要說(shuō)明下圖數(shù)據(jù)庫(kù)到底快在哪里带迟。 如下我們有個(gè)朋友關(guān)系表:

> SELECT * FROM friends;

+-------------+--------------+

| user_id ? ? | friend_id ? ?|

+-------------+--------------+

| 1 ? ? ? ? ? | 2 ? ? ? ? ? ?|

| 1 ? ? ? ? ? | 3 ? ? ? ? ? ?|

| 1 ? ? ? ? ? | 4 ? ? ? ? ? ?|

| 2 ? ? ? ? ? | 5 ? ? ? ? ? ?|

| 2 ? ? ? ? ? | 6 ? ? ? ? ? ?|

| 2 ? ? ? ? ? | 7 ? ? ? ? ? ?|

| 3 ? ? ? ? ? | 8 ? ? ? ? ? ?|

| 3 ? ? ? ? ? | 9 ? ? ? ? ? ?|

| 3 ? ? ? ? ? | 10 ? ? ? ? ? |

+-------------+--------------+

對(duì)于關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),這種多對(duì)多的模型囱桨,除了基本的users表之外仓犬, 這個(gè)朋友之間的映射關(guān)系表必然需要建一張。

也就是說(shuō)雖然我們RDBMS這么多年的數(shù)據(jù)庫(kù)設(shè)計(jì)舍肠,比如ER設(shè)計(jì)中的Relationship或者以外鍵的形式存在搀继,或者以中間表的形式存在。

我們現(xiàn)在需要查詢這樣一個(gè)場(chǎng)景翠语,找userid=1用戶的朋友的朋友叽躯,也就是社交網(wǎng)絡(luò)里的2度查詢,大家想想這個(gè)SQL應(yīng)該怎么寫(xiě)(不難肌括,大家自己試驗(yàn)一下吧)点骑。

問(wèn)題是在互聯(lián)網(wǎng)海量數(shù)據(jù)的社交模型中,2度查詢太簡(jiǎn)單了谍夭,6度查詢或者更高呢黑滴?你這個(gè)SQL語(yǔ)句還能寫(xiě)出來(lái)么或者說(shuō)能跑出來(lái)么?(6度查詢的笛卡爾積是相當(dāng)恐怖的數(shù)字)紧索。

但是對(duì)于圖數(shù)據(jù)庫(kù)而言跷跪,Relationship關(guān)系是一等公民(在圖數(shù)據(jù)庫(kù)領(lǐng)域一般叫做Edge, 圖中的箭頭), 與上圖中用戶本身的頂點(diǎn)Vetex(圖中的圓)是相同的地位。

在圖數(shù)據(jù)庫(kù)中齐板,我要查詢userid=1用戶的朋友的朋友,只需要先定位到Vertex(1)葛菇,然后從這個(gè)頂點(diǎn)遍歷所有的friend Edge, 就可以查詢出想要的結(jié)果甘磨,就算是6度查詢,也不過(guò)是多了幾層遍歷而已眯停,這個(gè)性能的消耗是線性的济舆,完全不是關(guān)系型數(shù)據(jù)庫(kù)笛卡爾積的指數(shù)性增長(zhǎng)可比!

100個(gè)用戶可能區(qū)別不大莺债,但如果是100w的用戶關(guān)系圖譜滋觉,對(duì)于圖數(shù)據(jù)庫(kù)而言都是從一個(gè)點(diǎn)來(lái)遍歷,性能沒(méi)有明顯的區(qū)別齐邦。

有個(gè)比較好理解的類比椎侠,想象你作為一個(gè)觀眾坐在八萬(wàn)人體育館看球賽,這是一場(chǎng)沒(méi)人關(guān)注的比賽措拇,賽場(chǎng)只做了100個(gè)人我纪,那在你座位旁邊的人(視作有關(guān)系)是有限的幾個(gè)人,或者甚至旁邊沒(méi)人;但是如果這是一場(chǎng)同城德比超級(jí)火爆的比賽浅悉,賽場(chǎng)坐滿了八萬(wàn)人趟据,坐在你旁邊跟你有關(guān)系的人其實(shí)還是有限的那幾個(gè)而已(有限“度”的遍歷),離你遠(yuǎn)的人對(duì)從你開(kāi)始的遍歷沒(méi)有任何顯著的影響术健!

這就是圖數(shù)據(jù)庫(kù)的魅力汹碱, 我應(yīng)該說(shuō)明白了吧?

再來(lái)幾個(gè)裝逼理論

六度分離問(wèn)題

六度分離(六度區(qū)隔)理論(Six Degrees of Separation):“你和任何一個(gè)陌生人之間所間隔的人不會(huì)超過(guò)五個(gè)荞估,也就是說(shuō)咳促,最多通過(guò)五個(gè)人你就能夠認(rèn)識(shí)任何一個(gè)陌生人∑貌眨”

根據(jù)這個(gè)理論等缀,你和世界上的任何一個(gè)人之間只隔著五個(gè)人,不管對(duì)方在哪個(gè)國(guó)家娇昙,屬哪類人種尺迂,是哪種膚色。

這個(gè)理論也是做社交網(wǎng)絡(luò)的一個(gè)基本理念冒掌。

柯尼斯堡七橋問(wèn)題

-- 一筆畫(huà)問(wèn)題

在哥尼斯堡的一個(gè)公園里噪裕,有七座橋?qū)⑵绽赘駹柡又袃蓚€(gè)島及島與河岸連接起來(lái)(如圖)。問(wèn)是否可能從這四塊陸地中任一塊出發(fā)股毫,恰好通過(guò)每座橋一次膳音,再回到起點(diǎn)?歐拉于1736年研究并解決了此問(wèn)題铃诬,他把問(wèn)題歸結(jié)為如右圖的“一筆畫(huà)”問(wèn)題祭陷,證明上述走法是不可能的。

這個(gè)問(wèn)題的解決被世人作為圖論的起源來(lái)看待趣席,歐拉也由此被稱為“圖論之父”兵志。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宣肚,隨后出現(xiàn)的幾起案子想罕,更是在濱河造成了極大的恐慌,老刑警劉巖霉涨,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件按价,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笙瑟,警方通過(guò)查閱死者的電腦和手機(jī)楼镐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)往枷,“玉大人鸠蚪,你說(shuō)我怎么就攤上這事今阳。” “怎么了茅信?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵盾舌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蘸鲸,道長(zhǎng)妖谴,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任酌摇,我火速辦了婚禮膝舅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窑多。我一直安慰自己仍稀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布埂息。 她就那樣靜靜地躺著技潘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪千康。 梳的紋絲不亂的頭發(fā)上享幽,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音拾弃,去河邊找鬼值桩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豪椿,可吹牛的內(nèi)容都是我干的奔坟。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搭盾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛀蜜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起增蹭,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磅摹,沒(méi)想到半個(gè)月后滋迈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡户誓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帝美。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍彭。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庇忌,到底是詐尸還是另有隱情舞箍,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布皆疹,位于F島的核電站疏橄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏略就。R本人自食惡果不足惜捎迫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望表牢。 院中可真熱鬧窄绒,春花似錦、人聲如沸崔兴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恼布。三九已至螺戳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間折汞,已是汗流浹背倔幼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爽待,地道東北人损同。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鸟款,于是被迫代替她去往敵國(guó)和親膏燃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容