柚子快報邀請碼778899分享:一個項目,用十款數(shù)據(jù)庫?
柚子快報邀請碼778899分享:一個項目,用十款數(shù)據(jù)庫?
大家好,我是豆小匠。
關(guān)于數(shù)據(jù)庫,大學(xué)的時候只知道MySQL,學(xué)習(xí)深入點也就是用到了Redis、MongoDB等非關(guān)系型數(shù)據(jù)庫。
然而,工作中用到的數(shù)據(jù)庫實在太多,每種數(shù)據(jù)庫都有自身的優(yōu)勢和局限性。所以在這里梳理下日常常用數(shù)據(jù)庫和適用場景,走起!
1. 常用數(shù)據(jù)庫
1.1. 關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫通常是業(yè)務(wù)型項目的主力數(shù)據(jù)庫,原因以下:
方便業(yè)務(wù)建模,表的關(guān)系和業(yè)務(wù)之間的關(guān)聯(lián)是類似的。數(shù)據(jù)一致性,關(guān)系型數(shù)據(jù)庫一般支持ACID特性,可用于核心業(yè)務(wù)場景的數(shù)據(jù)持久化。
關(guān)系型數(shù)據(jù)庫的基本單位是表,表與表之間通過鍵關(guān)聯(lián),比如學(xué)生表和班級表,可以通過班級ID,把學(xué)生和班級關(guān)聯(lián)起來。
關(guān)系型數(shù)據(jù)庫的經(jīng)典代表:MySQL、Orcle、PostgreSQL、SQLite等。
1.2. 非關(guān)系型數(shù)據(jù)庫
非關(guān)系型數(shù)據(jù)庫其實只是一個比較籠統(tǒng)的叫法,實際分類下有非常多,這里只介紹鍵值對、文檔、列式存儲、圖形結(jié)構(gòu)等幾種。
1.2.1. KV數(shù)據(jù)庫
KV數(shù)據(jù)庫以鍵值對的形式存儲數(shù)據(jù),常見底層數(shù)據(jù)結(jié)構(gòu)實現(xiàn)是哈希表,讀數(shù)據(jù)復(fù)雜度是O(1)。
keyvaluebeangoodmilkbad
key-value存儲的數(shù)據(jù)通常單個key-value就是一個條獨立的數(shù)據(jù),很方便水平擴(kuò)展,可以根據(jù)key散列到不同的分片,且讀的性能極好,因此常用于做緩存。
經(jīng)典的代表有Redis、Memcached和LevelDB等。
1.2.2. 文檔型數(shù)據(jù)庫
文檔型數(shù)據(jù)庫的數(shù)據(jù)以文檔的形式存儲數(shù)據(jù),每個文檔類似一個JSON對象。
相比于KV存儲,文檔型數(shù)據(jù)庫同樣對水平擴(kuò)展友好,且具有更好的查詢性能,支持復(fù)雜查詢,而KV存儲幾乎只通過key來讀取數(shù)據(jù)。
經(jīng)典的文檔型數(shù)據(jù)庫有MongoDB,CouchDB和Elasticsearch等。
1.2.3. 列式存儲數(shù)據(jù)庫
經(jīng)典的列式存儲數(shù)據(jù)庫有HBase、Druid、ClickHouse等,不同列式數(shù)據(jù)庫的底層實現(xiàn)差別挺大的,它們的共同點是按列存儲。
比如說MySQL存一個學(xué)生信息,有學(xué)號和姓名等,這兩個字段在同一行,存放也是在一起的;但是列式數(shù)據(jù)庫會按列劃分存儲,把學(xué)號和姓名分開存儲,相同的數(shù)據(jù)類型有利于進(jìn)行數(shù)據(jù)壓縮、聚合操作等。
下面是HBase的一條數(shù)據(jù)組成解析,一個Row Key(行鍵)下有多個Column Family(列族),列族下面有Column Qualifier(列限定符),最后會根據(jù)設(shè)置保存若干個版本,形成Timestamp/version: Cell Value的鍵值對。這里我們只需要知道不同的列族是分開存儲的就行了。
1.2.4. 圖數(shù)據(jù)庫
圖數(shù)據(jù)庫的基本單元是點和邊,經(jīng)典的圖數(shù)據(jù)庫包括Neo4j、OrientDB、TigerGraph等。
簡單來說點表示實體,而邊則表示實體間的關(guān)系,組成一個整體后,可以形成知識圖譜、社交網(wǎng)絡(luò)、金融風(fēng)控網(wǎng)絡(luò)等。
比如存儲了上圖關(guān)系,可以直接查詢關(guān)注了豆小匠Coding的用戶:
MATCH (user:User {name: '豆小匠Coding'})<-[:FOLLOWS]-(follower:User)
RETURN follower.name
上述查詢使用了 Neo4j 的圖查詢語言 Cypher。它首先通過 MATCH 子句找到名為豆小匠的用戶節(jié)點 user,然后通過 -[:FOLLOWS]-> 關(guān)系查找所有關(guān)注了該用戶的節(jié)點 follower。最后,通過 RETURN 子句返回關(guān)注者的姓名。
2. 場景下的數(shù)據(jù)庫
2.1. Demo項目
SQLite,一個輕量級的數(shù)據(jù)庫,不需要獨立服務(wù)器或者系統(tǒng)級別的配置,只需要一個文件,就可以存儲數(shù)據(jù)庫所有數(shù)據(jù),適用于小型設(shè)備或者嵌入式系統(tǒng)等。
如果你只是做一個demo級別的項目,也可以使用SQLite,然后使用ORM框架來操作數(shù)據(jù),后面切換MySQL也只需要修改數(shù)據(jù)庫連接邏輯。
2.2. MySQL遇到瓶頸
如果是單機(jī)MySQL遭遇性能瓶頸,可以通過主從架構(gòu)讀寫分離,堆機(jī)器的方式解決,另一個方向是增加緩存,如Redis等,減少打到物理存儲的請求量。
如果是數(shù)據(jù)量太大,單表查詢性能下降,可以考慮分庫分表,但是分庫分表在開發(fā)時需要考慮更多分布式事務(wù)、水平擴(kuò)展等因素,對研發(fā)效率有影響。因此,這個時候可以考慮使用分布式數(shù)據(jù)庫,如TiDB等。
2.3. 場景專用數(shù)據(jù)庫
隨著業(yè)務(wù)的復(fù)雜,我們會發(fā)現(xiàn)不同場景下對數(shù)據(jù)庫的要求差異會很大:
一致性優(yōu)先,選用關(guān)系型數(shù)據(jù)庫。高性能全文搜索,使用Elasticsearch。非關(guān)鍵數(shù)據(jù),讀多寫少,量大,選用列式存儲。離線數(shù)據(jù)分析,Hive。
這期就喵到這!能讀到這里的朋友,點個贊唄!
柚子快報邀請碼778899分享:一個項目,用十款數(shù)據(jù)庫?
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。