當前位置:
首頁 > 科技 > 何時棄用 MongoDB?

何時棄用 MongoDB?

即使位列資料庫排行榜的 Top 5,MangoDB 的日子也並不好過。

自去年 10 月,MangoDB 宣布將開源許可協議從 GNU AGPLv3 切換至 Server Side Public License 之後,AWS、RedHat、Fedora、Debian、Lyft 等項目以及企業隨即相繼宣布將移除 MangoDB,一時之間,MangoDB 成為眾矢之的。但捫心自問,MangoDB 真的如此糟糕嗎?我們又該如何做出正確的選擇?

作者 | Justin Etheredge

譯者 | 彎月

責編 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下為譯文:

最近,我讀到了一篇關於紅帽公司的Satellite不再支持MongoDB的文章(有些人說這是因為許可條款方面的修改。)這不禁讓我想起過去幾年裡,我經常看到有關文章說為何MongoDB如此可怕,以及為何大家都不應該再使用MongoDB。然而,與此同時,MongoDB已經發展成為一款更為成熟的產品。那麼 ,情況究竟如何呢?難道所有的這些仇恨真的只是由於MongoDB在早期實現和營銷中犯下的錯誤嗎?還是說人們責怪MongoDB,只是因為他們沒能正確地評價MongoDB是否適合自己?

趨勢聚焦

多年來,我一直在從事軟體行業,但即便如此,我也只是經歷了一小部分對該行業帶來了衝擊性的趨勢。我目睹了4GL、AOP、敏捷、SOA、Web 2.0、AJAX、區塊鏈,以及等等諸多技術的崛起。每年軟體工程領域都會出現新的趨勢。其中一些很快就遭遇了失敗,還有一些則從根本上改變了軟體開發的方式。

隨著創新技術開始引領潮流,人們的興趣驟然而生,於是大家紛紛開始湧入,或者看到其他躍躍欲試的人群為其造勢。高德納公司為整個過程專門定義了「技術成熟度曲線」(The Hype Cycle),雖然存在爭議,但該曲線確實正確地評估了一項有價值的技術的發展成熟過程。

但每隔一段時間,就會出現一種新的創新(或者是舊已有技術的再度復甦),而這種創新由其中的某一種特定的實現所驅動。以NoSQL為例,其就受到了MongoDB的出現以及迅速崛起的大幅推動。這場運動並非源自MongoDB,但是大型互聯網公司的數據挑戰確實推動了非關係型資料庫的回歸。Google的Bigtable和Facebook的Cassandra等項目相繼湧現,然而,MongoDB才是大多數開發人員最易獲取,也是最方便實現的NoSQL資料庫。

註:現在,你可能在想,我這不是把列式資料庫、鍵/值存儲或眾多其他數據存儲類型都混雜到了NoSQL旗下嗎?你說的沒錯,但是當時這種情況確實發生了。每個人都一股腦扎進NoSQL中,堅稱他們離不開NoSQL,但實際上他們並沒有真正理解其中所涉及的不同技術。對於很多人來說,MongoDB就是NoSQL。

開發人員對此表示反對。無模式資料庫無限擴展的概念可以應對任何挑戰,因此非常誘人。在2014年左右,幾乎到處都有人在使用MongoDB,而放到一年前人們都還都在使用MySQL、Postgres或SQL Server這樣的關係資料庫。如果你問他們MongoDB,他們的回答各不相同:有人的說辭很老套「網路規模擴展的需要」,也有人經過了深思熟慮「我的數據結構非常鬆散,特別適合無模式資料庫」。

重要的是不要忘記,MongoDB和一般的文檔資料庫可以解決傳統關係資料庫無法應對的如下難題:

嚴格的模式:在關係資料庫中,如果你有動態的數據,則不得不創建一堆隨機的「雜項」數據列,將數據按塊保存起來,或者使用 EAVEAV設置……所有這些方法都存在嚴重的缺陷。

難以擴展:在關係資料庫中,如果你的數據過於龐大,則無法保存到一太伺服器中;而MongoDB擁有跨多台計算機擴展數據的機制。

難以修改模式:數據無法遷移!在關係資料庫中,變更資料庫的結構是一項巨大的挑戰(特別是你的數據量十分龐大的情況下)。MongoDB可以大幅簡化這一過程,而且很容易上手,你可以不斷更新你的模式並快速移動。

寫入性能:MongoDB的性能非常好,尤其是按照某種方式配置的情況下。MongoDB開箱即用的寫入配置受到的抨擊最多,但也確實帶來了出色的性能。

注意事項

MongoDB提供的潛在優勢非常大,尤其是對於面臨某些特定類型的問題的人。如果不配合上下文,或對於沒有經驗的人來說,閱讀了上述列表就會以為MongoDB確實給資料庫系統帶來了顛覆性的改變。然而,上述優勢還存在一些注意事項,下面我會一一列出。

公平地說,10gen / MongoDB Inc.並不是沒有考慮到這些問題,他們只是做出了權衡利弊。

沒有事務 :事務可以說是許多關係資料庫的核心特徵(雖然不是全部,但確實是大多數)。事務意味著你能夠以原子方式執行多項操作,並始終確保數據保持一致。當然,在NoSQL資料庫中,你可以在一個文檔中包含一個事務,或者也可以通過分兩個階段提交的策略實現事務機制。但關鍵在於,這項工作必須由你自己完成……而且要保證正確無誤的話,這可能也是一項富有挑戰性且需要付出大量精力的工作。除非你看到資料庫中的數據出現非法的狀態,否則你往往無法意識到數據丟失的問題,只因為你無法保證操作的原子性。注意:很多人可能會提醒我,MongoDB 4.0已經於去年引入了事務機制,但是仍然存在很多局限性。正如本文開頭所說,請評估是否能夠滿足你的需求。

沒有關係完整性(外鍵):如果你的數據之間存在關係,那麼你就需要將這些關係保存下來。幾乎所有數據中都包含某種關係,如果資料庫強制體現這些關係,那麼就必須由你的應用程序來負責。如果資料庫強制執行這些關係,那麼就可以大大減輕應用程序的負擔,從而減輕工程師的工作量。

缺乏執行數據結構的能力:強模式有時候可能會帶來痛苦,但它們也能成為確保數據結構良好的強大機制。如果合理利用,你就可以通過這種強大的機制,確保你的數據在結構上符合你的期望。MongoDB等文檔資料庫在模式方面提供了驚人的靈活性,然而,這種靈活性會將責任轉嫁到維護者身上,由他們負責數據的清潔。如果你不付出這些努力,那麼最終你不得不在應用程序中大量代碼,處理那些結構上與預期不符的數據。我們常常說:應用遲早需要重寫,但數據將永遠存在。注意:MongoDB支持模式驗證,該功能非常有用,但仍然無法提供可以與關係資料庫相媲美的保障。主要在於添加或修改模式驗證不會影響集合中現有的數據,你需要確保更新的數據匹配新模式。因此,到底是否滿足需求還得由你自己來決定。

自定義查詢語言/沒有工具生態系統:SQL在剛剛出現時絕對掀起了一場革命,從那以後再也沒有任何變化。SQL是一種非常強大的語言,但也富有挑戰性。你必須使用由JSON片段組成的自定義查詢語言查詢資料庫,對於經驗豐富的SQL人員來說,這是一個巨大的退步。此外,我們有一整套可與SQL資料庫互操作的工具,從IDE到報告工具,應有盡有。切換到不支持SQL的資料庫意味著你就無法使用大多數的工具了,或者你也可以想辦法將輸入保存到SQL資料庫中,那麼你就可以繼續使用這些工具了,只不過這個過程可能比你想像得還難。

許多使用MongoDB的開發人員沒有深入理解他們為權衡付出的代價,而且他們常常將MongoDB作為應用程序的主要數據存儲。而這樣的決定通常意味著極為昂貴的成本。

我們應該怎麼做?

當然,並不是每位開發人員都會不計後果地一頭扎進去。但這樣的情況也著實不少,未來幾年會有不少項目在意識到不適合後放棄MongoDB。如果這些組織能夠花點時間系統地考慮一下他們做出的技術選擇,那麼也許就不會有那麼多人做出這樣的選擇了。

那麼,我們怎樣才能確定哪種技術適合實際情況呢?目前已經有不少人嘗試為評估技術創建系統性的框架,例如「軟體公司引入技術的框架」(http://www.wohlin.eu/spi96.pdf),「評估軟體技術的框架」(https://pdfs.semanticscholar.org/4268/30dd5dd944d3b75ec56b2a3b151c18afbaf9.pdf)。但我認為不需要弄得如此複雜。

我們只需要通過以下兩個主要問題,就合理地評估眾多技術,但是難點在於找到能夠負責任地回答這些問題的人,他們願意花時間回答這些問題,同時確保答案中毫無偏見。

「如果你沒有遇到某個特定問題,就不需要引入新的工具。」

問題一:我需要解決哪些問題?

如果你沒有遇到某個特定問題,就不需要引入新的工具。你可以就此打住。不要拿著解決方案反過來找問題。如果你沒有遇到問題,那麼就不需要新技術來更好地解決問題,所以就不需要決策。如果你是看到別人在使用某種技術,才考慮自己也使用,那麼你應該先想一想他們遇到的問題,然後再問問自己是否也面臨同樣的問題。當你看到別的公司使用某種技術時,自己也會情不自禁,難點在於判斷你自己是否也面臨相同的困難。

問題二:我放棄了什麼?

很明顯,這個問題更加難以回答,因為你必須深入剖析,並對新舊兩種技術都有很好的理解。有時候,在使用新技術構建出產品之前,你很難真正掌握這項技術,你也可以諮詢那些在這項技術上花費了大量時間的人。

如果你既沒有實際的使用經驗,也沒有人可以諮詢,那麼就應該考慮如何通過最小的投資確認該技術是否有價值。此外,如果你進行了投資,那麼撤銷這項決策的難度有多大?

人類總是把事情搞砸

你必須時刻牢記,如果你想不偏不倚地回答這些問題,那麼就必須與人類的天性作鬥爭。為了有效地評估技術,必須克服一系列的認知偏差,下面僅舉幾個例子:

從眾心理:相信每個人都聽說過,但要克服這一點卻非常艱難。請確保只選擇能夠解決你的實際需求的技術,而不要盲目跟風。

喜新厭舊:許多軟體開發人員都會低估他們長期使用的技術,同時高估新技術的優勢。這不僅僅是軟體工程師特有的問題,每個人都有這樣的傾向。

正面特點效應:有時我們只能看到眼前的東西,而會忽略不存在的東西。如果這一點與「喜新厭舊」的心理交織起來,那麼有可能造成嚴重的破壞。因為你不僅更加看重新技術,還會忽視新技術中存在的弊端。

客觀地看待事物是一種挑戰,但了解可能影響到你的偏見,有助於你做出更合理的決策。

總結

當一項新的創新出現(或復甦)時,我們需要非常謹慎地回答以下兩個問題:

這個工具能為我們解決實際問題嗎?

我們是否清楚其中的權衡利弊?

如果你無法自信地回答這兩個問題,那麼就需要後退一步,重新進行評估。

MongoDB到底是不是正確的選擇?是,它當然是,但是與大多數軟體工程中的問題一樣,你需要視情況而定。對於那些在這兩個問題上有明確答案的團隊來說,他們很多人都發現了MongoDB的價值,而且他們還會不斷挖掘更多的價值。對於那些沒有具體答案的人,希望他們能夠從中吸取寶貴的教訓(而不用付出慘重代價),學習如何駕馭技術成熟度曲線。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

涼山火災啟示錄:面對大火,AI 能做些什麼?
為何優秀的程序員不斷離開?| 暢言

TAG:CSDN |