天天看點

如何處理資料庫動态字段

      随着業務的不斷擴充,突然面臨着這樣一種場景:需要動态的增添資料庫的字段,例如使用者自定義的标簽,列的數量都不能确定,這種情況怎麼辦呢,我首先想到的是用alter直接動态的增删資料庫表字段,但是立馬得到了上司的否決,經過多番查找後,這樣做确實是有問題,就像類設計模式中提出的封閉原則,一個類确定好了之後,可以拓展但是不能修改,動态的DDL确實不好。經過多番查找後,網上有這麼幾種做法,記錄一下。

一、預留足夠的列(備援多列,做動态映射)

     例如提前預留field0.field1.....fieldN

     優點:相較于其他做法,比較穩定,不用行轉列,不用解析XML。

     缺點:會有大量的空的字段,需要記錄映射關系,查詢時比較複雜。

二.單字斷儲存XML格式

   例如添加一個XML格式字段:将動态字段以逗号分隔,所有的字段都在一個列裡

   優點:擴充容易,維護容易。

   缺點:在查詢或解析時需要大量的用substring等對字元串的處理,性能上有問題。

三、變列為行

    例如隻用一個表,隻有三個字段id,fieldName,fieldValue,将動态字段的名稱和值放進去。

   優點:擴充容易,結構簡單。

   缺點:資料量比較大,查詢時可能比較慢。

四、為每一個動态字段的組合建立一個表的執行個體

   例如每出來一個組合,就建立一個包含該組合字段的表

   優點:查詢比較快,對改變不是很頻繁的場景下性能較好。

   缺點:如果組合比較多的情況下,就會産生多張這種表的執行個體,比較難維護,擴充性不強。

總結:

   每一種做法都有自己的優點和缺點,每一種做法可能在某一種應用場景下最适合,我們要善于取舍,在性能和擴充性上取的一個平衡點,也許還可以将多種做法進行組合優化,但是我個人感覺這些做法都不是很好,這也跟mysql資料庫的設計有關,本身在支援這種場景上就不是很友好,期待以後哪一位大牛(或者我,哈哈哈)能弄出一個比較全面的解決方案,能夠更好的解決這個問題,因為我覺的像這種問題還是很常見的,應該要有一種比較通用的,同時性能,拓展性都比較好的解決方案。

繼續閱讀