系统中一般存在很多整个系统的全局配置,还需要可以更改。我们可以设置一个key-value表,使用的时候根据key获取值即可。
表设计如下:
CREATE TABLE `kv` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`k_name` varchar(100) NOT NULL COMMENT '名称',
`k` varchar(32) NOT NULL COMMENT 'key',
`vc` varchar(64) DEFAULT NULL COMMENT '字符串类型的value',
`explain_init` varchar(100) NOT NULL COMMENT '参数说明,新增的时候填入,编辑不可更改',
`remark` varchar(100) DEFAULT NULL COMMENT '备注',
`is_configuration` int(1) NOT NULL DEFAULT '0' COMMENT '是否可配置(0 否 1是)',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_k` (`k`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=112 DEFAULT CHARSET=utf8 COMMENT='通用k-v';
为了统一和便于处理,值统一使用varchar来保存,获取的时候转换类型即可。
explain_init 是参数说明,新增的时候填入,编辑的时候不可更改,可以给使用人一个提醒;
remark 是对本值的一个详细说明;
is_configuration 表示是否可以配置,不可配置的就只是程序中使用的(比如存一些临时值),不能直接修改。
至此,已经能满足基本的需求了。
更加深入的:一般值都有单位才有意义,上面的设计中,是没有单位的,所以程序中必须基于某个设定,单位要统一,比如时间单位设定为秒,距离单位设置为米。一般都是这个域的较小的单位。
为了方便设置,我们还可以添加一个字段表示单位。
增加一个字段,表示基于一个标准的倍率,rate,默认就是 1,使用的时候用 vc * rate 即可。
如此,在配置的时候怎么知道选择那些倍率呢?
再添加一个获取倍率的类型,新增一个表,此表保存单位与单位之间的关系。然后在kv表新增一个字段,表示选择什么单位,关联此表的unit,如此设置某个值的时候就可以知道选择哪些单位。
CREATE TABLE `unit` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`unit` varchar(16) NOT NULL COMMENT '区别时间、距离等',
`rate` bigint(16) unsigned NOT NULL DEFAULT '1' COMMENT '倍率,就是单位与单位之间的换算关系',
`unit_name` varchar(16) NOT NULL COMMENT '单位的名字',
PRIMARY KEY (`id`),
KEY `index_unit` (`unit`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
比如时间的就选择time,距离的就选择distance,质量的就选择quality。