很多时候我们需要使用数据库存储配置项,由于各种原因我们无法使用配置文件来完成,例如在一个有很多节点集群环境中使用文件配置文件时非常不方便。
DROP TABLE IF EXISTS `config`; CREATE TABLE IF NOT EXISTS `config` ( `key` varchar(50) NOT NULL, `value` varchar(50) NOT NULL, `operator` varchar(50) NOT NULL DEFAULT 'dba', `mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站动态配置文件'; INSERT INTO `config` (`key`, `value`, `operator`, `mtime`) VALUES ('cache.apc', 'ON', 'dba', '2013-07-18 16:17:13'), ('cache.file.path', '/tmp', 'dba', '2013-07-18 16:17:57'), ('cache.redis', 'YES', 'dba', '2013-07-18 16:17:22'), ('payment.alipay.status', 'Enabled', 'dba', '2013-07-18 16:15:15'), ('payment.alipay.url', 'http://xx.comx.com', 'dba', '2013-07-18 16:16:38'), ('payment.yeepay.status', 'Enabled', 'dba', '2013-07-18 16:15:17'), ('payment.99bill.status', 'Enabled', 'dba', '2013-07-18 16:15:10'), ('payment.zqpay.status', 'Disabled', 'dba', '2013-07-18 16:15:20');
配置项key的写法很讲究
单个配置 database.host=localhost database.user=user database.pass=pass 多个配置 database.1.host=localhost database.1.user=user database.1.pass=pass database.1.status=1 database.2.host=localhost database.2.user=user database.2.pass=pass database.2.status=1 优化配置项,例如:payment.alipay.status 可以这样优化 payment.status.alipay payment.status.yeepay
这样做的目的是为了更好的使用like进行查询
select `key`,`value` from config where `key` like 'payment.status.%'; select `key`,`value` from config where `key` like 'database.?.status';
我有一个表,里面只有固定行数的行记录,这些数据就是配置参数,我们将配置文件保存在数据库中,因为需要做负载均衡而不能使用文件配置文件。
有这样一个需求,这个记录每次修改都要保存历史记录,用于审计等等。我是这样设计该表的
CREATE TABLE `config_fee` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `level` INT(11) NULL DEFAULT NULL COMMENT '层级', `type` ENUM('Deposit','Withdrawing') NOT NULL DEFAULT 'Withdrawing' COMMENT '类型,存款,取款', `min_fee` FLOAT(10,2) NOT NULL COMMENT '最低手续费', `max_fee` FLOAT(10,2) NOT NULL COMMENT '最高手续费', `ratio` FLOAT(10,2) NOT NULL COMMENT '手续费比例', `operator` VARCHAR(10) NOT NULL COMMENT '操作者', `status` ENUM('Current','Trash') NOT NULL DEFAULT 'Current', `ctime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `mtime` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) COMMENT='手续费管理' COLLATE='utf8_general_ci' ENGINE=InnoDB;
数据记录的形态
mysql> select type,operator,status,ctime,mtime from config_mtf_fee; +---------+----------+---------+---------------------+---------------------+ | type | operator | status | ctime | mtime | +---------+----------+---------+---------------------+---------------------+ | Deposit | 141 | Trash | 2014-08-28 11:10:17 | 2014-08-28 11:10:57 | | Deposit | 141 | Trash | 2014-08-28 11:10:17 | 2014-08-28 11:10:57 | | Deposit | 141 | Trash | 2014-08-28 11:10:17 | 2014-08-28 11:10:57 | | Deposit | 141 | Trash | 2014-08-28 11:10:17 | 2014-08-28 11:10:57 | | Deposit | 324 | Current | 2014-08-28 11:10:54 | 2014-08-28 11:10:59 | +---------+----------+---------+---------------------+---------------------+ 2 rows in set (0.00 sec)
如上图所示,状态 Current 是当前记录,而Trash是废弃的历史记录。
每次修改数据,首先将Current改为Trash,然后插入一条新数据状态为Current,我们只会使用最后一条状态为current的数据。
原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。