ENUM型と整数型を使用する利点と欠点は?


110

ランダムなテーブルにstatusという名前の列があるとします。実際の値は、有効または無効になります

この列のデータ型がint / bool(1または0)であるか、またはand ENUMの値で使用する方が良いでしょうか?長所と短所は何ですか?enableddisabled

有効なステータスが2つだけではなく、4または10以上あるとしますか?必要な値の数が増えると、長所と短所はどちらか一方に左右されますか?


5
この質問は、すべてのMySQL開発者がブックマークする必要があります。これは、失恋や勝利の原因になる可能性があるためです。+1 !!!
-RolandoMySQLDBA

回答:


70

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

記事がなくても


1
このスレッドの他の回答は非常に有益ですが、非常に役立つ記事のため、このスレッドを回答としてマークしています。
ジェイクウィルソン

6
+1他のテーブルのENUM列のメンバーリストを再利用することはできません。ENUMには、他のDBMSへの移植性が制限されています。
いつか

フィールドに同じテーブルの他のレコードとのリレーションがある場合、何をする必要がありますか?たとえばunits、各レコードが関連するユニットのプロパティを持つショップアイテムのモデルを想定しますcomposition。すなわち、トン、Kg、gm
SaidbakR

その記事について奇妙なことは何もありません-それは素晴らしいことです!なぜ彼らが悪いのかは、この投稿が原因だと思います!+1しました!
ベラス

1
この記事では、ENUM型ではなく、古き良きテーブルを使用することを提案しています。これを答えに追加する必要がありますか?
-Utku

39

さて、まずストレージ要件があります。私はあなたが(intではなく)tinyintを意味すると仮定します。

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

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

しかし、あなたがより多くの価値を追加するにつれて、どんな利点もから離れ始めENUMます。特に、テーブルが既に使用されている後に値を追加する場合は、対応するためにテーブル構造を変更する必要があるためです。

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


4
唯一の本当の利点に言及するための+1:文字列表現。他のすべては、将来の洗浄です。
-RolandoMySQLDBA

19

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

私はそれが次の欠点を持っていることがわかります:

  • コードに関する追加のメタデータの機能はありません。
  • 値の追加または無効化が困難です。(コードを無効にするには、トリガーと有効期限フィールドを使用します。)
  • データベース内の国際化は実行できません。
  • テーブル間で再利用できません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.