1. 程式人生 > 其它 >資料表擴充套件欄位(轉)

資料表擴充套件欄位(轉)

如何定義資料表的擴充套件欄位

因為產品升級或者產品專案適配等一些原因, 我們的關係型資料庫的資料欄位需要進行擴充套件; 比如我們原有一張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), 擴充套件欄位配置表和擴充套件欄位值表

多個表的擴充套件欄位屬性和擴充套件欄位值,配置儲存在一張表中,值分開儲存在多張表中

擴充套件欄位表:

擴充套件欄位值表:

  • 優點:優點:只需維護配置表即可,減少程式碼維護量
  • 缺點:操作比較複雜