千尋中數據庫的一點經驗

Posted on May 8, 2012 -

通過半個多學期的實踐,我發現,想用好數據庫真的是沒那麼容易。

之前有兩篇文章來敘述千尋的數據庫設計,但在實踐中,千尋並沒有按照之前設計的方式來使用數據庫。最主要的原因是,數據在MongoDB和redis中重複出現,這個冗餘帶來的一致性問題比較難以解決,雖然在寫代碼的時候已經通過code review來儘量避免數據的不一致,但一致性的bug還是難以避免。

在這個項目中,我們一共使用了MongoDB和Redis兩個數據庫。下面分別來簡述一下兩個數據庫在使用中的優劣:

MongoDB:MongoDB是一個典型的文檔型數據庫。在一些場合下,MongoDB真的是非常適合,比如保存一下用戶信息,或者文章之類的。但是一旦需要用到relation,MongoDB就無能爲力了。同樣,在需要事務的場合,MongoDB也是無能爲力的。但是MongoDB也具有無可替代的優點,它支持空間索引,常見的數據庫裏,只有MongoDB支持空間數據索引,這正是千尋所需要的核心功能。

Redis:Redis是一個非常好用的key-value數據庫,和memcached相比,它的功能要強大很多,不僅支持簡單的key-value存儲,還提供集合、對象、列表等較高級的存儲功能,此外也提供了自增等原子操作,基本上可以滿足千尋這樣一個交流工具的需求。但在使用中,我們也發現,Redis的編程方式與傳統的程序不一樣,這使得調試變得格外困難。

實踐中,Redis的表現非常突出,不僅性能很高,而且它對多種數據結構的支持使得它足以應付千尋中除了空間索引外的其他所有需求。因此,通過對千尋的開發,我們認爲,一個更理想的數據庫設計應該是:使用Redis作爲主數據庫,而MongoDB僅用於存儲地理位置,以提供近鄰查找的功能。

由於我們也是剛開始接觸NoSQL,有些觀點難免確保正確,因此歡迎各位批評指正。