1. 程式人生 > >數據庫可擴展設計方案

數據庫可擴展設計方案

table 行數據 ol3 成長 升級 上線 程序 高並發 留空

數據庫表的字段擴展方案

傳統方案
一. 預留字段
預留字段就是在數據庫表設計之初,預先留一定的字段用於後續的業務擴充,例如
在設計之初用戶表為user(uid,name,col1,col2,col3....)。當需要擴展字段時可以直接試用預留字段。
優點
1. 業務擴展後新增不需要鎖表
2. 避免alter table user add命令造成鎖表,當表中數據很多時這個語句會造成長時間的鎖表。
缺點:
1. 預留空字段浪費空間(雖然可以忽略不記)。
2. 預留字段可讀性往往不強,雖然可以用過alter table user rename column語句去改寫列名,但一樣會造成鎖表,影響tps。
3. 當預留字段用完或者數據類型和要新增字段不符的場景下,還是需要用alter table user add命令去添加字段。

二. 新建表做join
大數據高並發下join帶來的性能問題會嚴重影響tps,而且一些優化器不太好的數據庫遇到join容易變的很慢。做view等同於做join

增加數據冗余反範式化的方案
一. 使用版本號和通用字段
即在設計之初用戶表為user(uid,name,version,content)
系統剛上線(v0版本)時數據為
1 張三 0 {passwd:123}
2 李四 0 {passwd:456}
v1版本增加了age,sex字段後數據為
1 張三 0 {passwd:123}
2 李四 0 {passwd:456}
3 王五 1 {passwd:789,sex:1,age:10}
舊版本數據可以通過寫個運維程序來更新,這樣增加字段就不需要鎖表了。
優點
新增字段無需鎖表,數據可以區分版本,舊數據升級簡單
缺點
1. content字段內的數據無法做索引,不過有些數據庫支持json檢索
2. content字段內的真實字段有大量冗余,1000條數據就要存1000個冗余的"passwd"、"sex"和"age"

二、通過行來進行數據擴展
用戶表的結構變成了這樣 user(uid,key,value)
系統上線時數據是
1 name 張三
1 passwd 123
2 name 李四
2 passwd 123
系統改版後數據變成
1 name 張三
1 passwd 123
2 name 李四
2 passwd 123
3 name 王五
3 passwd 123
3 sex 1
3 age 18

優點:
1. 動態擴展不需要鎖表
2. 可以針對每一個屬性創建索引(實際上對uid建索引就夠了)
3. 舊數據可以寫個運維程序來更新

缺點
1. 數據庫記錄數很多,每增加一個屬性就要線性增長
2. 大量的冗余數據(key字段)

數據庫可擴展設計方案