概述
随着业务的不断扩展,突然面临着这样一种场景:需要动态的增添数据库的字段,例如用户自定义的标签,列的数量都不能确定,这种情况怎么办呢,我首先想到的是用alter直接动态的增删数据库表字段,但是立马得到了领导的否决,经过多番查找后,这样做确实是有问题,就像类设计模式中提出的封闭原则,一个类确定好了之后,可以拓展但是不能修改,动态的DDL确实不好。经过多番查找后,网上有这么几种做法,记录一下。
一、预留足够的列(冗余多列,做动态映射)
例如提前预留field0.field1.....fieldN
优点:相较于其他做法,比较稳定,不用行转列,不用解析XML。
缺点:会有大量的空的字段,需要记录映射关系,查询时比较复杂。
二.单字断保存XML格式
例如添加一个XML格式字段:将动态字段以逗号分隔,所有的字段都在一个列里
优点:扩展容易,维护容易。
缺点:在查询或解析时需要大量的用substring等对字符串的处理,性能上有问题。
三、变列为行
例如只用一个表,只有三个字段id,fieldName,fieldValue,将动态字段的名称和值放进去。
优点:扩展容易,结构简单。
缺点:数据量比较大,查询时可能比较慢。
四、为每一个动态字段的组合创建一个表的实例
例如每出来一个组合,就创建一个包含该组合字段的表
优点:查询比较快,对改变不是很频繁的场景下性能较好。
缺点:如果组合比较多的情况下,就会产生多张这种表的实例,比较难维护,扩展性不强。
总结:
每一种做法都有自己的优点和缺点,每一种做法可能在某一种应用场景下最适合,我们要善于取舍,在性能和扩展性上取的一个平衡点,也许还可以将多种做法进行组合优化,但是我个人感觉这些做法都不是很好,这也跟mysql数据库的设计有关,本身在支持这种场景上就不是很友好,期待以后哪一位大牛(或者我,哈哈哈)能弄出一个比较全面的解决方案,能够更好的解决这个问题,因为我觉的像这种问题还是很常见的,应该要有一种比较通用的,同时性能,拓展性都比较好的解决方案。
最后
以上就是干净白开水为你收集整理的如何处理数据库动态字段的全部内容,希望文章能够帮你解决如何处理数据库动态字段所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复