2011-04-29 48 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