key+value实现动态字段的存储设计
一般我們在存儲例如用戶信息的時候,用戶信息的各屬性是固定的,這時我們可以通過如下方式設計表:
user(user_id, name, age, sex)
但是,如果某天呢,產品說用戶信息需要加幾個屬性:height、weight。
此時,如果表沒什么數據當然是想加直接加上就行了,代碼中跟著添加幾個字段就OK了。但是如果數據量和并發量特別大怎么辦?
alter table add column是不行的,因為鎖表時間會很長。
這里說一種key+value的存儲方式實現方法,此時表設計為:
user(user_id, key, value)
表里數據樣式為:
| 1 | name | 張三 |
| 1 | age | 50 |
| 1 | sex | 男 |
| 1 | height | 170 |
| 1 | weight | 120 |
| 2 | name | 小胖呆 |
| 2 | age | 30 |
| 2 | sex | 男 |
這種將一行存儲的數據拆成在一列里面存儲的方式就是key+value動態字段存儲。
key+value存儲方式優缺點
優點:
可以隨時動態擴展字段屬性
缺點:
1) key值有大量冗余。建議key短一些
2) 行數會增加很多
3)索引設計可能比較麻煩
key+value存儲方式使用場景
服務端,wordpress,EAV,配置,統計項、APP或者PC客戶端、保存個人信息等等
key+value應用場景之——自定義頁面功能設計
在有些系統中,可能會有這樣一個需求:用戶可以自定義某個頁面的表單個數及樣式。至于樣式的自定義怎么實現,不是這里要說的,這里只說說關于表單個數的自定義實現。
在這種需求里,你不會知道用戶到底會定義多個表單,這樣你就不能在一張表里固定字段的個數。這時就可以利用key+value方式實現。
我們模擬一個業務場景:系統中有一個作物信息采集頁面,每個種植公司可根據自己的需求設置不同的表單;例如公司A希望該頁面能收集:作物品種、種植地塊、作物高度、有無草害、有無蟲害;而公司B則希望收集:作物品種、種植地塊、當時田間溫度、采集時間。
先設計出如下幾張表(只有關鍵的字段):
模(mu)板表:model(id, model_name, company_id)
字段描述分別是:主鍵、模板名稱、公司ID
模板部件表:model_parts(id, key_name, label, required, type, model_id)
字段描述分別是:主鍵、表單name,表單里的label、是否必填、類型(數字或字符串)、模板ID
作物信息采集表: crop_info(id, key, value, company_id, model_id)
字段描述分別是:主鍵、表單name,表單值,公司ID,模板ID
接著給各表添加數據:
模板表(model)需要管理員添加數據:
| 1 | 玉米數據采集模板 | 100 |
| 2 | 土豆數據采集模板 | 101 |
部件表(model_parts):在作物采集頁面顯示的都是來源于部件表的數據。
| 1 | category | 作物品種 | 1 | 2 | 1 |
| 2 | land_name | 種植地塊 | 1 | 2 | 1 |
| 3 | height | 作物高度 | 1 | 1 | 1 |
| 4 | grass | 有無草害 | 1 | 1 | 1 |
| 5 | insect | 有無蟲害 | 1 | 1 | 1 |
| 6 | category | 作物品種 | 1 | 2 | 2 |
| 7 | land_name | 種植地塊 | 1 | 2 | 2 |
| 8 | temperatrue | 田間溫度 | 1 | 2 | 2 |
| 9 | collect_time | 采集時間 | 1 | 2 | 2 |
作物采集表: crop_info
| 1 | category | 玉米 | 100 | 1 |
| 2 | land_name | 地塊一 | 100 | 1 |
| 3 | height | 120 cm | 100 | 1 |
| 4 | grass | 有 | 100 | 1 |
| 5 | insect | 無 | 100 | 1 |
| 6 | category | 土豆 | 101 | 2 |
| 7 | land_name | 江家灣地塊 | 101 | 2 |
| 1 | temperatrue | 36.5 | 101 | 2 |
| 1 | collect_time | 2018-10-10 | 101 | 2 |
以上所有遵循正規的表設計,這里只是提供一個思路
作物采集表就完全體現了key+value動態存儲的思想。
總結
以上是生活随笔為你收集整理的key+value实现动态字段的存储设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一分钟明白各种SQL语句加的什么锁——《
- 下一篇: 知识网址收集