我要为日志系统设计一个数据库。
许多String列将具有有限数量的值,但事先不知道:如发送消息的模块的名称,或源主机名。
我想将它们存储为MySQL枚举以节省空间。因此,这个想法是,当枚举遇到新值时,它们会增长。
我将以这样的列开始:
host ENUM('localhost')
然后,在Java中,我将在启动时加载一次为主机名定义的enum值(我如何使用MySQL/JDBC ?? ?),并且每当遇到新主机时,我将更改enum。
你认为这是一个可行的/好主意吗?你做过这样的事吗?提前感谢您的建议。
拉斐尔这不是一个好主意。ENUM不是为此而设计的。您可以创建单独的表(host_id, host_name),并在主表中使用引用。例子:
CREATE TABLE `host` (
`host_id` INT(10) NOT NULL AUTO_INCREMENT,
`host_name` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`host_id`)
)
CREATE TABLE `log` (
`log_id` INT(10) NOT NULL AUTO_INCREMENT,
`host_id` INT(10) NULL DEFAULT NULL,
...
PRIMARY KEY (`log_id`),
INDEX `FK__host` (`host_id`),
CONSTRAINT `FK__host` FOREIGN KEY (`host_id`) REFERENCES `host` (`host_id`) ON UPDATE CASCADE ON DELETE CASCADE
)
乌利希期刊指南:
我认为最好的方式来存储主机是varchar/文本字段。这是最简单和最快的方式。我想你不必担心空间的问题。
。
为主机使用第二个表将减小大小,但会使编写日志变得复杂。使用ENUM会使编写变得复杂,并显著降低性能。