別再用MongoDB了!
Sven Slootweg (joepie91) 是一名 黑客 ,同時也是 CrytoCC 的創建者,現在提供 Node.js代碼評審服務 。近日,他在個人博客上發表了一篇博文《 為什么你應該永遠、永遠、永遠不要再使用MongoDB 》。在文中,他列舉了如下理由:
- 丟失數據(見 1 、 2 );
- 默認忽略錯誤,假設每次寫入都是成功的,在32位系統上,這可能會導致數據無聲無息地丟失;
- 即使是在MongoDB宣傳的適用場景下,其性能依然不高(見 3 、4);
- 幾乎在所有的應用場景下,開發者都會被迫養成使用隱式模式的壞習慣(見4);
- 存在鎖問題(見4);
- 對安全問題響應很慢(見 5 );
- 不符合ACID(見 6 );
- 擴展和維護困難;
- JSON存儲也不是MongoDB獨有的功能,PostgreSQL、CouchDB也支持(見 7 、 8 )。
joepie91認為,MongoDB不僅存在諸多問題,而且并無突出之處。如果項目涉及用戶賬戶或者兩條記錄之間存在某種關系,那么就應該使用關系型數據庫,而不是文檔存儲;如果項目在使用 Mongoose ,那么也應該使用關系型數據庫,因為Mongoose只是使用文檔存儲模擬了有模式的關系型數據庫。因此,大多數情況實際上需要的都是一個關系型數據庫。 在這些情況下,PostgreSQL是個不錯的可選方案。開發者可以使用查詢構建器或ORM來簡化使用過程,比如,在Node.js中,可以選用 Knex 、 Bookshelf 、 Sequelize 或 Waterline 。即使真得需要一個文檔存儲,那么也有 比MongoDB更好的選項 。另外,他也不認為MongoDB適合于創建原型,因為如果生產環境使用不同的數據庫,則還需要重寫所有的代碼。總之,MongoDB并沒有什么適用場 景。它在技術上比不上其它可選方案,并沒有提供真正有用的獨有的特性,而且開發人員也無法確保數據一致性和安全。最后,joepie91指出,流行度并不 等同于質量,只能說明產品有一個不錯的市場團隊:
永遠不要因為“其他人那樣做”就使用一個數據庫,對于一個特定的數據庫,要自己研究它的優點和不足。
joepie91的觀點 在Hack News上 得到了廣泛的贊同。網友karmakaze也認為,有了PostgreSQL 9.4,就沒有任何理由要使用MongoDB了(JSONB比BSON更合用),另外還可以使用CouchDB。對于MongoDB的具體限制,網友 giaour建議閱讀aphyr的系列文章 Call Me Maybe ,并指出,雖然存在已知的變通方案,但那大大降低了MongoDB的開發體驗。網友Animats認為,如果站點的流量比維基小,那么使用某種關系型數據庫就可以了。網友PebblesHD有類似的觀點:
作為一個規模較小的部署……,只安裝一個基本的MySQL有什么問題嗎?在我們的內部維基上,我們每天的訪問量已經超過了2萬次……
但是也有一些不同的聲音。例如,網友threeseed就表示,MongoDB仍然是最容易安裝和使用的數據庫之一。對此,joepie91回復如下:
以錯誤的方式做事,想不容易都難——MongoDB恰好就是那么做的。它不需要設置身份驗證或表模式,因此才看上去“易于安裝”。但實際上,為了節省10分鐘,你正在浪費幾個小時的時間。因為稍后,你將會遇到入侵(沒有身份驗證)或數據破壞……
Shodan 的 報道 也佐證了joepie91的這一說法,互聯網上有將近3萬個MongoDB實例沒有啟用任何的身份驗證。這個問題隨處可見,而且已經存在多年。
網友toyg則評論說:
我最近首次使用了MongoDB,是在一個內部項目里。我認為,沒有模式確實顯著了提升了開發速度……現在項目已經成熟,回過頭來,我可以看到 為什么關系型數據庫會更合適,但如果我從開始就使用RDBMS,那么我可能無法這么快地完成遷移。雖然切換到真正的RDBMS意味著要修改三兩個類,但變 化不大。所以,我不同意MongoDB不適合原型開發的說法。
joepie91對“修改三兩個類,但變化不大”的說法提出了質疑,因為根據自己從事代碼審查的經驗,遷移到不同的數據庫通常需要大量的工作。至于切換速度,joepie91指出,在一個有回滾機制的系統中,可能會更快。
然而,在有些情況下,開發者并沒有其它選擇。例如,有網友就提出, Meteor 就使用而且只能使用MongoDB。而由于同Hadoop的合作伙伴關系,MongoDB同Hadoop有很好的集成,因此,它在大數據分析領域非常流行。
另外,來自 SourceGear 的軟件開發人員Eric Sink在讀過的joepie91文章之后 表示 :
(他所列舉的內容)部分(也許全部)確有其事。事實上,現在,就假設他所寫的都是正確的。我這里不是要說作者是錯的。更確切地說,我這里想指出的是,這種博文只能讓我了解很少有關MongoDB的知識,但卻讓我感受到了寫這篇博文的人的許多情感。
他覺得,不能因為那些問題就徹底地否定MongoDB,畢竟:
MongoDB是頂級的NoSQL供應商。每天,成千上萬的企業用它為數以百萬計的用戶提供服務。像所有有大量用戶的新生軟件一樣,它有漏洞和缺陷。但它正穩步改善。任何有關技術缺陷的討論,如果無助于解決問題,那么很大程度上只能是一種情緒的宣泄。