我要为一个日志系统设计一个数据库。
许多字符串列的值是有限的,但事先是未知的:比如发送消息的模块的名称,或者源主机名。
为了节省空间,我想将它们存储为MySQL枚举。因此,我们的想法是,枚举随着它们遇到新的值而增长。
我会从下面这样的专栏开始:
host ENUM('localhost')然后,在Java中,我将在启动时一次加载为主机名定义的枚举值(如何使用MySQL/JDBC执行此操作?),并在遇到新主机时更改enum。
你认为这是一个可行的/好主意吗?你做过这样的事情吗?
提前感谢您的建议。
拉斐尔
发布于 2011-04-29 18:30:21
这不是一个好主意。ENUM不是为此而设计的。您可以只创建单独的表(host_id、host_name)并在主表中使用refference。示例:
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/text字段。这是最简单、最快的方法。我认为你不需要担心空间问题。
尽管如此。
对主机使用第二个表将减小大小,但会使写入日志变得复杂。使用ENUM会使写入变得复杂,并显著降低性能。
https://stackoverflow.com/questions/5830683
复制相似问题