Navicatブログ

列挙型(Enum)をデータベースに格納する 2022年10月5日  Robert Gravelle

情報技術(または、より一般的に知られているIT)の領域では、列挙型は、定義済みの定数のセットをカプセル化する特別なデータ型です。そのため、変数は、定義済みの値の1つしか保持できません。一般的な例には、北、南、東、西のコンパス方位や曜日などがあります。

列挙型をデータベーステーブルに格納する際の複雑な要因の1つは、列挙型の値が数値またはアルファベット(つまり、文字列)である可能性があることです。さらに、許容される列挙型セットの一部ではない値をユーザーがテーブルに追加できないようにする必要があるでしょう。本日のブログでは、これらの問題の両方に対処します。

列挙型の値の調査

最も基本的な列挙型には、Javaで以下に示すように、それぞれが定数で表される一連のゼロから始まる序数値が含まれます:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

より複雑な列挙型には、他の型も含まれる場合があります。文字列が最も一般的ですが、より複雑なオブジェクトもサポートされています。様々な環境URLを表す列挙型を次に示します(こちらもJavaで):

public enum Environment 
{
    PROD("https://prod.domain.com:1088/"), 
    SIT("https://sit.domain.com:2019/"), 
    CIT("https://cit.domain.com:8080/"), 
    DEV("https://dev.domain.com:21323/");
 
    private String url;
 
    Environment(String envUrl) {
        this.url = envUrl;
    }
 
    public String getUrl() {
        return url;
    }
}

一般的に、列挙を序数値として格納することは、デバッグとサポートが困難になるため、悪い方法と見なされます。通常は、文字列に変換された実際の列挙値を格納することがお勧めです。説明のために、Card Suitの列挙があると想像してください:

public enum Suit { 
  Spade, 
  Heart, 
  Diamond, 
  Club 
}

あなたが次のクエリ結果のいずれかを解読しようとしているデータベース専門家であると想像してください:

Name          Suit
------------  ----
John Smith    2
Ian Boyd      1

Name          Suit
------------  -------
John Smith    Diamond
Ian Boyd      Heart

最初のオプションではソースコードを取得し、各列挙メンバーに割り当てられた数値を見つける必要があるため、後者の方が解釈がはるかに簡単であることに同意していただけると思います。

文字列の格納にはより多くのディスク容量が必要ですが、列挙メンバー名は短くなる傾向があり、ハードドライブは安価であるため、日々の作業をより簡単にするためにトレードオフの価値があります。

数値を使用する場合のもう1つの問題は、数値の更新が難しいことです。古い数値を強制することなく、メンバーを簡単に挿入または再配置することはできません。例えば、Unknownの値をSuit列挙に追加するには、次のように更新する必要があります:

public enum Suit { Unknown = 4, Heart = 1, Club = 3, Diamond = 2, Spade = 0 }

...データベースに既に保存されている従来の数値を維持するために。

データベース内の列挙値の検証

MySQLやSQL Serverなどの最新のデータベースの多くは、ENUMデータ型をサポートしています。文字列として指定されたENUM値は、コンパクトストレージ用に格納される時に自動的に数値としてエンコードされます。

Navicat for MySQLでシャツとそのサイズを含むテーブルを作成して値を入力するMySQLステートメントと、中サイズのシャツを取得するSELECTクエリを次に示します:

mysql_enum (57K)

無効なENUM値を挿入しようとすると、次のエラーが発生します:

mysql_enum_error (52K)

メッセージには値が切り捨てられたことが示されていますが、データは実際には挿入されていません。

結論

今日のブログでは、列挙値を格納、検証、挿入、取得する方法など、データベースで列挙値を使用する方法について説明しました。

Navicat for MySQLを試すことに興味がありますか?14日間無料で使えます!

ブログのアーカイブ
シェア