天天看点

如何处理数据库动态字段

      随着业务的不断扩展,突然面临着这样一种场景:需要动态的增添数据库的字段,例如用户自定义的标签,列的数量都不能确定,这种情况怎么办呢,我首先想到的是用alter直接动态的增删数据库表字段,但是立马得到了领导的否决,经过多番查找后,这样做确实是有问题,就像类设计模式中提出的封闭原则,一个类确定好了之后,可以拓展但是不能修改,动态的DDL确实不好。经过多番查找后,网上有这么几种做法,记录一下。

一、预留足够的列(冗余多列,做动态映射)

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

     优点:相较于其他做法,比较稳定,不用行转列,不用解析XML。

     缺点:会有大量的空的字段,需要记录映射关系,查询时比较复杂。

二.单字断保存XML格式

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

   优点:扩展容易,维护容易。

   缺点:在查询或解析时需要大量的用substring等对字符串的处理,性能上有问题。

三、变列为行

    例如只用一个表,只有三个字段id,fieldName,fieldValue,将动态字段的名称和值放进去。

   优点:扩展容易,结构简单。

   缺点:数据量比较大,查询时可能比较慢。

四、为每一个动态字段的组合创建一个表的实例

   例如每出来一个组合,就创建一个包含该组合字段的表

   优点:查询比较快,对改变不是很频繁的场景下性能较好。

   缺点:如果组合比较多的情况下,就会产生多张这种表的实例,比较难维护,扩展性不强。

总结:

   每一种做法都有自己的优点和缺点,每一种做法可能在某一种应用场景下最适合,我们要善于取舍,在性能和扩展性上取的一个平衡点,也许还可以将多种做法进行组合优化,但是我个人感觉这些做法都不是很好,这也跟mysql数据库的设计有关,本身在支持这种场景上就不是很友好,期待以后哪一位大牛(或者我,哈哈哈)能弄出一个比较全面的解决方案,能够更好的解决这个问题,因为我觉的像这种问题还是很常见的,应该要有一种比较通用的,同时性能,拓展性都比较好的解决方案。

继续阅读