gpt4 book ai didi

mysql - MySQL/JDBC 中的动态 ENUM

转载 作者:行者123 更新时间:2023-11-30 21:22:47 33 4
gpt4 key购买 nike

我要为日志系统设计一个数据库。

许多字符串列的值数量有限,但事先不知道:比如发送消息的模块名称,或源主机名。

我想将它们存储为 MySQL 枚举以节省空间。因此,我们的想法是枚举在遇到新值时增长。

我会从这样的专栏开始:

host ENUM('localhost')

然后,在 Java 中,我会在启动时一次加载为主机名定义的枚举值(我如何使用 MySQL/JDBC 做到这一点??),并且每当遇到新主机时我都会更改枚举。

您认为这是可行的/好主意吗?你做过这样的事吗?

提前感谢您的建议。

拉斐尔

最佳答案

这不是个好主意。 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/text 字段。这是最简单和最快的方法。我认为您不必担心空间。

尽管如此。

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

关于mysql - MySQL/JDBC 中的动态 ENUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5830683/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com