设计系统架构时,我们总是希望一个架构或者说是模型能支持多种业务场景,当然场景是系统范围内的。比如说做商品系统,商品有多种属性,不同类型的商品的属性不一样,怎么用关系型数据库去保存这些不同的属性呢?再比如做CMS时,除了基本的背景、位置、类型、状态等属性一致外,页面不同地方需要的数据结构却是不一样的。 再比如做广告时,不同地方的广告需要用不同属性去区别,而它们又有一些共有的属性,比如类型,名称。
经过思考和查询,知道有如下几种方法来存储不同数据。 动态添加属性字段、 JSON 格式保存、 预留字段、 属性字段行存储。以用java为编程,mysql数据库为例,分别说下这几种方式如何实现动态字段。
1. 动态添加属性字段。
意思是,在需要添加一个属性时。先在数据库的表里添加一个字段,比如给新上的商品有"产地“这个属性,就给product表添加一个"产地"字段。那么要用这个字段时,还要改相应的java程序。显然这种方式不利于灵活扩展,而且在一张大表添加一个字段需要较长时间,这也不适合7*24的服务。
2.JSON 格式保存。
就是说把需扩展的一组字段都到到一个字段里,各个字段用json的方式组成一个大的字符串。比如:{"clsTypeName":"java.lang.Integer","srcDes":"支持数字或数字区间,如10,2-5","storeCol":"field2","storeName":"ord","viewName":"排名"}。这种方式,添加、修改、删除问题都不大,但查询