web-dev-qa-db-ja.com

ENUMとInteger型を使用する利点と欠点?

ランダムテーブルで、statusという名前の列があるとします。実際の値はenabledまたはdisabledのいずれかになります。

この列のデータ型がint/bool(1または0)であるか、ENUMを使用して値がenabledおよびdisabledである方が良いですか?長所と短所は何ですか?

有効なステータスが2つだけではなく、4つ、10、またはそれ以上あるとしましょう。必要な値の数が増えると、長所と短所がどちらに偏るか。

117
Jake Wilson

非常に奇妙ですが有益な記事を見つけました ENUMを使用してはいけない8つの理由.

記事がなくても知っている

73
RolandoMySQLDBA

さて、最初に ストレージ要件 があります。 (intの代わりに)tinyintを意味すると仮定します。

  • ENUMは1バイト(255未満の場合)または2バイト(最大65,535まで)
  • TinyIntは1バイトを取ります(最大値は255)
  • ブール値はTinyIntの同義語です

つまり、表面的にはすべて同じです。 ENUMはそれに関連付けられた文字列値のメタデータを一部取ります( 古いsrc

ただし、値を追加していくと、ENUMから有利になり始めます。特に、対応するためにテーブル構造を変更する必要があるため、テーブルがすでに使用されている後に値を追加する場合。

ENUMを使用する利点は何ですか?値の意味の文字列表現。私に関する限り、これで終わりです。どれだけ価値があるかは、アプリケーションによって異なります。

39
Derek Downey

ENUMはコードテーブルの短い形式の定義です。その主な利点は、結合してコードの説明を表示するために必要なコードを回避できることです。また、文字列形式で到着した場合の値の設定も簡単です。

私には次の欠点があります。

  • コードに関する追加のメタデータの機能はありません。
  • 値を追加または無効にするのが難しい。 (コードを無効にするには、トリガーと有効期限フィールドを使用します。)
  • データベースの国際化を行うことはできません。
  • テーブル間で再利用できません。
20
BillThor