傳統的關係型數據庫如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