關係型數據庫與nosql數據庫的比較

傳統的關係型數據庫如oracle、mysql在過去很長一段時間內佔據了數據庫領域的統治地位,隨着互聯網以及移動互聯網的爆發,近年開始流行的nosql以及newsql的崛起彷佛撼動了他們的地位。mysql

社區討論中常看到nosql數據庫(如mongodb、redis之類)比關係型數據庫快的說法,我嘗試分析一下。redis

關係型數據庫在進行數據庫建模的時候,一般是遵循三大範式,根據數據自己之間的關係進行建模,如用戶-訂單這樣一個簡單的關係,在關係型數據庫中,建模可能以下:sql

用戶表mongodb

user_id    user_name數據庫

訂單表oracle

order_id    user_id    item_id   item_countnosql

商品表分佈式

item_id    item_name    item_price設計

這樣的表結構設計,在查詢用戶的全部訂單時,須要聚合三張表的數據(join),因爲數據庫中的數據是按照表的不一樣順序存儲的,因此在關係型數據庫中聚合數據意味着更多的磁盤掃描。it

nosql數據庫是面向聚合的,是no schema的,更多的從查詢場景出發,例如,已知有獲取用戶全部訂單這樣的查詢,將用戶訂單做爲數據的一個聚合,結構以下:

{user_id : @user_id,user_name:@user_name,

    orders :[

                {order_id :@order_id,

                               items:[

                                        {item_id:@item_id,item_name:@item_name,item_price:@item_price,item_count:item_count}

                                        ]

                }

                ]

}

這種結構在查詢用戶全部訂單的時候,只有一條數據庫記錄,在大部分nosql數據庫中,同一條數據庫記錄是保存在磁盤中連續的塊中的(不一樣於oracle中的行連接、行遷移機制),這也就意味着更少的磁盤掃描,但同時形成了數據的冗餘。

大部分nosql數據庫都是分佈式的,根據分佈式中的CAP理論,最多隻能保證一致性、可用性、分區容錯性中的兩個,出現了最終一致性等說法。

nosql數據庫又分爲k-v,memory,document,big-table,graph幾種,不一一細說。

nosql數據庫並非普適的,傳統的關係型數據庫的地位不可替代。

推薦閱讀:nosql distilled

相關文章
相關標籤/搜索