2011-04-29 59 views
0

我即将为日志记录系统设计一个数据库。MySQL/JDBC中的动态ENUM

许多字符串列将具有有限的值,但未预先知道: 与发送消息的模块的名称或源主机名一样。

我想将它们存储为MySQL枚举以节省空间。 所以这个想法会是这个Enums会随着他们遇到新的价值而增长。

我会像一列开始:

host ENUM('localhost') 

然后,在Java中,我将在同一时间启动时加载的主机名定义枚举值(我怎么做,与MySQL/JDBC? ?),并且每当遇到新主机时我都会修改Enum。

你认为这是可行/一个好主意? 你有没有做过这样的事情?

在此先感谢您的建议。

Raphael

回答

1

这不是一个好主意。 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 
) 

UPD:

我认为存储主机的最好办法是为varchar /文本字段。这是最简单和最快的方式。我认为你不必担心这个空间。

尽管如此。

对主机使用第二个表会减小大小,但会使写入日志变得复杂。使用ENUM会使写入复杂化并显着降低性能。

+0

我想过这个标准的解决方案,但它有两个缺点给我: 1)它需要在查询日志时连接很多表,这会影响性能。 2)当直接管理MySQL表时,ENUM是自描述的,而参考ID有点模糊。 – 2011-04-29 10:56:01

+1

好的,谢谢... 我会这样做的“吻”的方式。 我想我只是想忘记早期的优化是Sofwtare发展中邪恶的根源。 – 2011-05-02 09:19:23