知乎專欄 | 多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者” |
很多時候我們需要使用資料庫存儲配置項,由於各種原因我們無法使用配置檔案來完成,例如在一個有很多節點集群環境中使用檔案配置檔案時非常不方便。
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的數據。