如果由我决定,我会使用包含键/值对的查找表,其中值是您想要的任何值。像这样的东西:
CREATE TABLE `lookup_rate_type`
(
`id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`), UNIQUE KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后,在您需要参考汇率的任何表格中,只需使用与您感兴趣的汇率相关的 id,让我们添加几行:
INSERT INTO `lookup_rate_type` SET name = 'second'; # id = 1
INSERT INTO `lookup_rate_type` SET name = 'minute'; # id = 2
INSERT INTO `lookup_rate_type` SET name = 'hour'; # id = 3
现在,如果您有一张需要参考费率的表格,您可以这样做:
INSERT INTO `some_table` SET rate = 27, rate_type_id = 3; # 27 / hour
INSERT INTO `some_table` SET rate = 3600, rate_type_id = 2; # 3600 / minute
这种方法的好处是,如果您决定只使用第一个字母来识别 rate_type,您只需更新lookup_rate_type
表:
UPDATE `lookup_rate_type` SET name = 's' WHERE ID = 1 LIMIT 1;
即使您更改了名称值(在您理解的上下文中,第二个变为 s),存储与该值的关系的任何表都将保持不变。
使用此解决方案,您可以根据需要向查找表添加任意数量的行,而不必运行更改语句来添加枚举,如果处理大型表,这可能会很痛苦。
此解决方案的唯一缺点是您可能需要使用类常量来允许您的应用程序代码访问 int 值,以便您可以根据您的业务逻辑执行 CRUD 操作,例如:
class LookupRateType
{
const SECOND = 1;
const MINUTE = 2;
}
// Calling code example
$sql = sprintf('INSERT INTO some_table SET rate = %d, rate_type_id = %d', 27, LookupRateType::MINUTE);
此外,如果您愿意,在处理一小部分常量时,您可以完全放弃查找表而只处理类常量。这里的缺点是您在查找特定数据时必须知道 id,而不是使用查询:
# If you use class constants only, you can do this
SELECT * FROM some_table WHERE rate_type_id = (SELECT id FROM lookup_rate_type WHERE name = 'hour');
# But if you can lookup the context with the code you can simply input the id
SELECT * FROM some_table WHERE rate_type_id = 3;
这些是我在处理大量不同应用程序时遇到的场景,并且发现查找表和/或类常量是最佳解决方案。