自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從SQL到NoSQL,數(shù)據(jù)庫(kù)還要向何處演進(jìn)?

數(shù)據(jù)庫(kù)
SQL和NoSQL數(shù)據(jù)庫(kù)提供了不同的權(quán)衡。雖然它們?cè)谔囟?xiàng)目的背景下可能會(huì)有競(jìng)爭(zhēng),但它們?cè)诟蠓秶鷥?nèi)是互補(bǔ)的,每一種都適合于不同的使用情況。是選擇SQL還是NoSQL并不是絕對(duì)的,要根據(jù)場(chǎng)景需求選合適的。

在開發(fā)一個(gè)應(yīng)用程序時(shí),不可避免要選擇使用SQL還是NoSQL數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)。傳統(tǒng)的數(shù)據(jù)庫(kù),即使用SQL(結(jié)構(gòu)化查詢語(yǔ)言)進(jìn)行查詢的關(guān)系型數(shù)據(jù)庫(kù),是經(jīng)過(guò)幾十年來(lái)技術(shù)發(fā)展、良好實(shí)踐和現(xiàn)實(shí)世界壓力測(cè)試的產(chǎn)物。它們是為可靠的事務(wù)和臨時(shí)查詢而設(shè)計(jì)的,是業(yè)務(wù)線應(yīng)用的主力軍。但它們也有一些限制,如嚴(yán)格的模式,使它們不太適合于其他類型的應(yīng)用。

NoSQL數(shù)據(jù)庫(kù)是針對(duì)這些限制而產(chǎn)生的。NoSQL系統(tǒng)存儲(chǔ)和管理數(shù)據(jù)的方式,允許高操作速度,并讓開發(fā)人員有巨大靈活性。許多數(shù)據(jù)庫(kù)是由谷歌、亞馬遜、雅虎和Facebook等公司開發(fā)的,它們尋求更好的方式來(lái)存儲(chǔ)內(nèi)容或處理大型網(wǎng)站的數(shù)據(jù)。與SQL數(shù)據(jù)庫(kù)不同,許多NoSQL數(shù)據(jù)庫(kù)可以在數(shù)百或數(shù)千臺(tái)服務(wù)器上進(jìn)行橫向擴(kuò)展。

不過(guò),NoSQL的優(yōu)勢(shì)并不是沒(méi)有代價(jià)的。NoSQL系統(tǒng)傾向于速度和可擴(kuò)展性,而不是SQL數(shù)據(jù)庫(kù)所承諾的可靠事務(wù)背后的ACID屬性。與圍繞SQL建立的數(shù)十年的機(jī)構(gòu)知識(shí)相比,在NoSQL系統(tǒng)中用于處理數(shù)據(jù)的隱喻也是相對(duì)較新的。

SQL和NoSQL數(shù)據(jù)庫(kù)提供了不同的權(quán)衡。雖然它們?cè)谔囟?xiàng)目的背景下可能會(huì)有競(jìng)爭(zhēng),例如,為不同應(yīng)用會(huì)面臨二選一的情況,但它們?cè)诟蠓秶鷥?nèi)是互補(bǔ)的,每一種都適合于不同的使用情況。是選擇SQL還是NoSQL并不是絕對(duì)的,要根據(jù)場(chǎng)景需求選合適的。

NoSQL與SQL

SQL和NoSQL之間的根本區(qū)別并不那么復(fù)雜。對(duì)于如何存儲(chǔ)和檢索數(shù)據(jù),兩者都有不同的理念。

對(duì)于SQL數(shù)據(jù)庫(kù),所有數(shù)據(jù)都有一個(gè)固有的結(jié)構(gòu)。像Microsoft SQL Server、MySQL、PostgreSQL或Oracle數(shù)據(jù)庫(kù)這樣的傳統(tǒng)數(shù)據(jù)庫(kù)使用一個(gè)模式--對(duì)插入數(shù)據(jù)庫(kù)的數(shù)據(jù)如何組成的正式定義。例如,一個(gè)表中的某一列可能被限制為只能是整數(shù)。因此,記錄在該列中的數(shù)據(jù)將有很高的規(guī)范化程度。SQL數(shù)據(jù)庫(kù)的嚴(yán)格模式也使得對(duì)數(shù)據(jù)進(jìn)行聚合變得相對(duì)容易,例如,使用SQL JOIN命令將兩個(gè)表的數(shù)據(jù)合并。

在NoSQL中,數(shù)據(jù)可以以無(wú)模式或自由的方式存儲(chǔ)。任何數(shù)據(jù)都可以存儲(chǔ)在任何記錄中。在NoSQL數(shù)據(jù)庫(kù)中,你會(huì)發(fā)現(xiàn)四種常見的數(shù)據(jù)存儲(chǔ)模式,這導(dǎo)致了四種常見的NoSQL系統(tǒng)類型。

  • 文檔數(shù)據(jù)庫(kù)(如MongoDB)。插入的數(shù)據(jù)以無(wú)模式的JSON結(jié)構(gòu)或“文檔”的形式存儲(chǔ),其中的數(shù)據(jù)可以是任何東西,從整數(shù)到字符串再到自由格式的文本。沒(méi)有必要指定JSON文檔將包含哪些字段(如果有的話)。
  • 鍵值存儲(chǔ)(如Redis)。自由格式的值,從簡(jiǎn)單的整數(shù)或字符串到復(fù)雜的JSON文檔,都可以通過(guò)鍵(比如字符串)在數(shù)據(jù)庫(kù)中訪問(wèn)。
  • 寬列存儲(chǔ)(如 Cassandra)。數(shù)據(jù)被存儲(chǔ)在列中,而不是像傳統(tǒng)SQL系統(tǒng)存儲(chǔ)在行。任何數(shù)量的列(以及許多不同類型的數(shù)據(jù))都可以根據(jù)查詢或數(shù)據(jù)視圖的需要進(jìn)行分組或聚合。
  • 圖數(shù)據(jù)庫(kù)(如Neo4j)。數(shù)據(jù)被表示為實(shí)體及其關(guān)系的網(wǎng)絡(luò)或圖形,其中圖中的每個(gè)節(jié)點(diǎn)是一個(gè)自由形式的數(shù)據(jù)塊。

無(wú)模式的數(shù)據(jù)存儲(chǔ)在以下情況下是有用的。

  • 你想快速訪問(wèn)數(shù)據(jù),你更關(guān)心訪問(wèn)的速度和簡(jiǎn)單性,而不是可靠的事務(wù)或一致性。
  • 你正在存儲(chǔ)大量的數(shù)據(jù),你不想把自己鎖定在一個(gè)模式中,因?yàn)橐院蟾淖兡J娇赡苁蔷徛屯纯嗟摹?/li>
  • 你正在從一個(gè)或多個(gè)來(lái)源接收非結(jié)構(gòu)化數(shù)據(jù),你想保持?jǐn)?shù)據(jù)的原始格式以獲得最大的靈活性。
  • 你想把數(shù)據(jù)存儲(chǔ)在一個(gè)分層結(jié)構(gòu)中,但你希望這些分層結(jié)構(gòu)由數(shù)據(jù)本身來(lái)描述,而不是外部模式。NoSQL允許數(shù)據(jù)隨意地自我引用,該方式對(duì)于SQL數(shù)據(jù)庫(kù)來(lái)說(shuō)更為復(fù)雜,難以模仿。

查詢NoSQL數(shù)據(jù)庫(kù)

關(guān)系型數(shù)據(jù)庫(kù)使用的結(jié)構(gòu)化查詢語(yǔ)言提供了一種統(tǒng)一的方式,在存儲(chǔ)和檢索數(shù)據(jù)時(shí)與服務(wù)器通信。SQL語(yǔ)法是高度標(biāo)準(zhǔn)化的,所以盡管各個(gè)數(shù)據(jù)庫(kù)可能會(huì)以不同的方式處理某些操作(例如,窗口函數(shù)),但基本原理仍然是相同的。

相比之下,每個(gè)NoSQL數(shù)據(jù)庫(kù)往往都有自己的語(yǔ)法來(lái)查詢和管理數(shù)據(jù)。例如,CouchDB使用JSON形式的請(qǐng)求,通過(guò)HTTP發(fā)送,以創(chuàng)建或檢索其數(shù)據(jù)庫(kù)中的文檔。MongoDB通過(guò)二進(jìn)制協(xié)議,以命令行接口或語(yǔ)言庫(kù)的方式發(fā)送JSON對(duì)象。

一些NoSQL產(chǎn)品可以使用類似SQL的語(yǔ)法來(lái)處理數(shù)據(jù),但只是在有限的范圍內(nèi)。例如,Apache Cassandra,一個(gè)廣泛的列存儲(chǔ),有自己的類似SQL的語(yǔ)言,Cassandra查詢語(yǔ)言(CQL)。CQL的一些語(yǔ)法是直接來(lái)自于SQL的手冊(cè),比如SELECT或INSERT關(guān)鍵字。但在Cassandra中沒(méi)有執(zhí)行JOIN或子查詢的本地方法,因此相關(guān)的關(guān)鍵字在CQL中并不存在。

無(wú)共享shared-nothing架構(gòu)

NoSQL系統(tǒng)常見的一個(gè)設(shè)計(jì)選擇是“shared-nothing”架構(gòu)。在一個(gè)無(wú)共享的設(shè)計(jì)中,集群中的每個(gè)服務(wù)器節(jié)點(diǎn)都獨(dú)立于其他節(jié)點(diǎn)運(yùn)行。系統(tǒng)不需要從其他節(jié)點(diǎn)獲得共識(shí)來(lái)返回?cái)?shù)據(jù)給客戶端。查詢速度很快,因?yàn)樗鼈兛梢詮淖罱幕蜃罘奖愕墓?jié)點(diǎn)返回。

無(wú)共享系統(tǒng)的另一個(gè)優(yōu)點(diǎn)是彈性和向外擴(kuò)展。向外擴(kuò)展集群非常容易,只需旋轉(zhuǎn)集群中的新節(jié)點(diǎn)并等待它們與其他節(jié)點(diǎn)同步即可。如果一個(gè)NoSQL節(jié)點(diǎn)宕機(jī),集群中的其他服務(wù)器將繼續(xù)運(yùn)行。即使服務(wù)請(qǐng)求的節(jié)點(diǎn)減少,所有數(shù)據(jù)仍然可用。

請(qǐng)注意,無(wú)共享的設(shè)計(jì)并不是NoSQL數(shù)據(jù)庫(kù)所獨(dú)有的。許多傳統(tǒng)的SQL系統(tǒng)可以以無(wú)共享的方式設(shè)置,如MySQL,盡管這通常涉及到犧牲整個(gè)集群的一致性以獲得性能。

NoSQL的局限性

如果NoSQL提供了如此多的自由和靈活性,為什么不完全放棄SQL?答案很簡(jiǎn)單,許多應(yīng)用仍然需要SQL數(shù)據(jù)庫(kù)所提供的各種約束、一致性和保障措施。在這些情況下,NoSQL的一些“優(yōu)勢(shì)”可能會(huì)變成劣勢(shì)。其他的限制來(lái)自于NoSQL系統(tǒng)缺乏某些在SQL領(lǐng)域中本應(yīng)有的功能。

(1) 無(wú)模式(No schema)

即使你接收的是自由格式的數(shù)據(jù),你也幾乎總是需要對(duì)數(shù)據(jù)施加約束,以使其有用。對(duì)于NoSQL,施加約束涉及到將責(zé)任從數(shù)據(jù)庫(kù)轉(zhuǎn)移到應(yīng)用開發(fā)者身上。例如,開發(fā)者可以通過(guò)一個(gè)對(duì)象關(guān)系映射系統(tǒng)(或稱ORM)強(qiáng)加結(jié)構(gòu)。但如果你想讓模式與數(shù)據(jù)本身共存,NoSQL通常不支持這種做法。

一些NoSQL解決方案為數(shù)據(jù)提供了可選的數(shù)據(jù)類型和驗(yàn)證機(jī)制。例如,Apache Cassandra有一系列的本地?cái)?shù)據(jù)類型,讓人想起傳統(tǒng)SQL中的那些數(shù)據(jù)類型。

(2) 最終一致性

NoSQL系統(tǒng)提供了強(qiáng)一致性或即時(shí)一致性的選擇,以獲得更好的可用性和性能。傳統(tǒng)的數(shù)據(jù)庫(kù)確保操作是原子的(事務(wù)的所有部分都成功,或者沒(méi)有一個(gè)成功)、一致的(所有用戶都有相同的數(shù)據(jù)視圖)、隔離的(事務(wù)不競(jìng)爭(zhēng))和持久的(一旦完成,它們將不受服務(wù)器故障的影響)。

這四個(gè)屬性,統(tǒng)稱為ACID,在NoSQL系統(tǒng)中可以用不同的方式處理。你可以選擇最終一致性,而不是要求整個(gè)集群的強(qiáng)一致性,這必然會(huì)延遲對(duì)請(qǐng)求的響應(yīng),允許服務(wù)請(qǐng)求,而無(wú)需等待最新的寫入復(fù)制到集群的其它節(jié)點(diǎn)。插入集群的數(shù)據(jù)最終在各處都是可用的,但不能保證任何時(shí)候可用。

對(duì)于一些NoSQL系統(tǒng),你可以在一致性和速度之間選擇一個(gè)折中方案,不同的產(chǎn)品有不同的方案。例如,微軟的Azure Cosmos DB可以讓你選擇每個(gè)請(qǐng)求的一致性級(jí)別,所以你可以選擇適合你的。事務(wù)語(yǔ)義,在SQL系統(tǒng)中保證事務(wù)中的所有步驟(例如執(zhí)行銷售和減少庫(kù)存)要么完成,要么回滾,在一些NoSQL系統(tǒng)中也有,例如MongoDB。

(3) NoSQL的鎖定

大多數(shù)NoSQL系統(tǒng)在概念上是相似的,但實(shí)現(xiàn)方式不同。每個(gè)系統(tǒng)都有自己的隱喻和機(jī)制,用于數(shù)據(jù)的查詢和管理。

這樣做的一個(gè)副作用是應(yīng)用邏輯和數(shù)據(jù)庫(kù)之間可能存在高度的耦合。如果你選擇一個(gè)NoSQL系統(tǒng)并堅(jiān)持使用它,這種耦合性并沒(méi)有什么壞處,但如果你在未來(lái)更換系統(tǒng),它就會(huì)成為一個(gè)絆腳石。

如果你從MongoDB遷移到CouchDB(或者相反),你需要做的不僅僅是遷移數(shù)據(jù)。還必須駕馭數(shù)據(jù)訪問(wèn)和編程隱喻之間的差異。換句話說(shuō),你必須重寫應(yīng)用程序中訪問(wèn)數(shù)據(jù)庫(kù)的部分。

(4) NoSQL技能

NoSQL的另一個(gè)缺點(diǎn)是相對(duì)缺乏專業(yè)知識(shí)。傳統(tǒng)SQL人才的市場(chǎng)相當(dāng)大,而NoSQL技能的市場(chǎng)卻剛剛起步。

作為參考,Indeed.com報(bào)告稱,截至2022年,傳統(tǒng)SQL數(shù)據(jù)庫(kù)(MySQL、微軟SQL Server、Oracle數(shù)據(jù)庫(kù)等)的職位數(shù)量仍然高于MongoDB、Couchbase和Cassandra的職位數(shù)量。對(duì)NoSQL專業(yè)知識(shí)的需求仍然只是SQL技能市場(chǎng)的一小部分。

合并SQL和NoSQL

未來(lái),隨著時(shí)間的推移,SQL和NoSQL系統(tǒng)之間的一些差異會(huì)消失?,F(xiàn)在已經(jīng)有許多SQL數(shù)據(jù)庫(kù)接受JSON文檔作為原生數(shù)據(jù)類型,并可以對(duì)該數(shù)據(jù)進(jìn)行查詢。一些數(shù)據(jù)庫(kù)甚至有對(duì)JSON數(shù)據(jù)施加約束的本地方法,因此其處理方式與傳統(tǒng)的行和列數(shù)據(jù)一樣嚴(yán)格。

另一方面,NoSQL數(shù)據(jù)庫(kù)不僅增加了類似SQL的查詢語(yǔ)言,還增加了傳統(tǒng)SQL數(shù)據(jù)庫(kù)的其他功能,比如MongoDB的ACID屬性。

一個(gè)可能的路徑是,未來(lái)幾代數(shù)據(jù)庫(kù)以及當(dāng)前數(shù)據(jù)庫(kù)系統(tǒng)的未來(lái)版本將跨越這些范式,同時(shí)提供SQL和NoSQL功能,有助于使數(shù)據(jù)庫(kù)世界不再支離破碎。例如,微軟的Azure Cosmos DB在底層使用了一套基元,可以互換地再現(xiàn)兩種系統(tǒng)的行為。谷歌云Spanner將SQL的強(qiáng)一致性與NoSQL系統(tǒng)的水平可擴(kuò)展性相結(jié)合。

不過(guò),純SQL和純NoSQL系統(tǒng)仍將在未來(lái)很多年占有一席之地。在設(shè)計(jì)靈活性、水平擴(kuò)展性和高可用性比強(qiáng)讀一致性和其他SQL數(shù)據(jù)庫(kù)常見的保障措施更重要的情況下,可以考慮使用NoSQL。對(duì)于許多應(yīng)用來(lái)說(shuō),這些保障措施很可能值得用來(lái)交換NoSQL所提供的東西。

對(duì)于許多應(yīng)用程序來(lái)說(shuō),以NoSQL的特有優(yōu)勢(shì)來(lái)那些換保障措施是值得。

責(zé)任編輯:趙寧寧 來(lái)源: IT168網(wǎng)站
相關(guān)推薦

2023-11-29 09:53:29

數(shù)據(jù)庫(kù)遷移SQL Server

2022-02-14 09:00:00

SQLNoSQL數(shù)據(jù)庫(kù)

2024-02-02 10:51:53

2011-03-17 17:50:39

SQL Server數(shù)

2021-01-28 09:00:00

SQL數(shù)據(jù)庫(kù)NoSQL

2025-04-03 11:04:40

2021-09-28 09:25:05

NoSQL數(shù)據(jù)庫(kù)列式數(shù)據(jù)庫(kù)

2018-05-07 09:30:41

數(shù)據(jù)庫(kù)NoSQLNewSQL

2011-10-09 09:38:03

OracleNoSQL

2024-07-17 11:40:58

2015-07-06 14:23:54

NoSQLSQL非關(guān)系型數(shù)據(jù)存儲(chǔ)

2011-08-02 16:27:50

SQLNoSQL

2010-07-14 17:26:16

SQL Server透

2025-03-31 08:20:00

SQL 查詢數(shù)據(jù)庫(kù)dsq

2018-03-02 09:00:00

數(shù)據(jù)庫(kù)NoSQLSQL

2021-06-01 21:55:33

物聯(lián)網(wǎng) IoTDB數(shù)據(jù)庫(kù)

2019-07-08 10:36:34

數(shù)據(jù)庫(kù)WebNoSQL

2019-03-20 15:59:11

NoSQLRedis數(shù)據(jù)庫(kù)

2011-07-19 09:08:50

JavaNoSQL

2010-04-01 09:45:38

NoSQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)