資料表擴充套件欄位(轉)
阿新 • • 發佈:2021-08-09
如何定義資料表的擴充套件欄位
因為產品升級或者產品專案適配等一些原因, 我們的關係型資料庫的資料欄位需要進行擴充套件; 比如我們原有一張user表, 其中有id, username, password欄位, 現在我們需要這個user的age, male, address屬性, 我們如何在原有的表基礎上實現擴充套件呢?
我們通常使用如下幾種方法來實現資料擴充套件: 動態新增欄位、JSON格式儲存、預留欄位、屬性欄位行儲存
(1), 動態新增屬性欄位
意思是,在需要新增一個屬性時。先在資料庫的表裡新增一個欄位。
比如說要給user有age的屬性,就給user表新增age欄位。那麼要用這個欄位時,還要改相應的java程式。顯然這種方式不利於靈活擴充套件,而且在一張大表新增一個欄位需要較長時間,這也不適合7*24的服務。
- 優點:符合資料表設計的習慣,實際使用中與原有欄位基本無差別
- 缺點:每增加一個屬性就要改相應的Java程式,不利於靈活擴充套件
(2), JSON格式儲存
就是說把需擴充套件的一組欄位都到到一個欄位裡,各個欄位用JSON的方式組成一個大的字串。
比如上邊的user表可以這樣設計:
欄位 | 型別 | 備註 | 資料例項 |
---|---|---|---|
id | int(10) | ID | 1239512 |
username | varchar(20) | 使用者名稱 | zhangsan |
password | varchar(20) | 密碼 | qwerty |
version | int(10) | 版本(擴充套件欄位的版本) | 3 |
extended_filed | varchar(200) | 擴充套件欄位 | {'age': '18', 'male': 'F', 'address': 'hefei'} |
- 優點:insert/update/delete都可以比較方便的操作;不用頻繁改動表結構和過多的Java程式碼
- 缺點:擴充套件欄位不支援索引;key名大量冗餘;如果要根據擴充套件欄位進行查詢不方便,也不高效,需要遍歷所以資料;
(3), 預留欄位
就是先給表定義幾個擴充套件欄位,還是以user表為例。
給user表定義幾個預留欄位,這樣任何資料型別都可以解析為字串,把編碼後的資料存進去就行了。
欄位 | 型別 | 備註 | 資料例項 |
---|---|---|---|
id | int(10) | ID | 1239512 |
username | varchar(20) | 使用者名稱 | zhangsan |
password | varchar(20) | 密碼 | qwerty |
extended_filed1 | varchar(50) | 預留擴充套件欄位1 | 18 |
extended_filed2 | varchar(50) | 預留擴充套件欄位2 | F |
extended_filed3 | varchar(50) | 預留擴充套件欄位3 | hefei |
- 優點:可以正常的select/insert/delete/update;一些複雜的查詢也可以實現
- 缺點:太少可能起不到作用,太多也不行,影響效能;擴充套件欄位是公用的,不能根據欄位名顧名思義,得在啟用時維護對應關係,使用時查詢對應關係;擴充套件欄位的數量無法精確定義。
(4), 屬性欄位行儲存
顧名思義,此方法需要新建一個屬性欄位表,在這個表裡維護擴充套件欄位的欄位名和欄位值
如user表的擴充套件欄位表
欄位 | 型別 | 備註 | 資料例項 |
---|---|---|---|
id | int(10) | ID | 13214213 |
user_id | int(10) | user表的ID屬性 | 1239512 |
filed_name | varchar(20) | 擴充套件欄位名 | age |
filed_value | varchar(20) | 擴充套件欄位值 | 18 |
- 優點:欄位名能夠顧名思義,欄位也可以動態擴充套件
- 缺點:key名稱大量冗餘,所以key命名儘量短,可使用編碼;select/insert/delete/update時需要操作兩張表,操作稍微複雜
(5), 擴充套件欄位配置表和擴充套件欄位值表
多個表的擴充套件欄位屬性和擴充套件欄位值,配置儲存在一張表中,值分開儲存在多張表中
擴充套件欄位表:
擴充套件欄位值表:
- 優點:優點:只需維護配置表即可,減少程式碼維護量
- 缺點:操作比較複雜