很多时候我们需要使用数据库存储配置项,由于各种原因我们无法使用配置文件来完成,例如在一个有很多节点集群环境中使用文件配置文件时非常不方便。
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的数据。