今日、私はプロジェクトでデータ型を選択することについて同僚といくつかの議論をしました。
私たちはWeb開発者であり、バックエンドをPHPでコーディングし、データベースにはmySQLを使用します。
それで、私は少しインターネットに行きました、そして彼らは様々な理由でENUMデータ型を推奨しません(これも推奨されないように私はここで読んだので)-例えばENUM('yes'、'no')の場合tinyint(1)を使用する必要があります。
ENUMが不良であり、回避する必要がある場合、たとえばvBulletinがENUMを使用するのはなぜですか?
VARCHARやTEXTなどを使用でき、PHPで2つの可能な値のうちの1つを強制的に使用できるのに、なぜそれらを使用するのか。
ご回答ありがとうございます。
1 に答える
列挙型は理想的ではありませんが、VARCHAR を使用していくつかの可能な値の 1 つを強制するという別の提案よりもはるかに優れています!
列挙型は、データを数値として格納します。これは、最小量のスペースを使用し、特に検索の場合に可能な限り迅速なアクセスを提供するため、「はい」または「いいえ」などの可能な値のセットが制限されたフィールドを格納するのに理想的です。
後でリストに値を追加する必要がある場合は、列挙型が失敗します。「たぶん」と「はい」または「いいえ」が必要だとしましょう。列挙型に格納されているため、この変更にはデータベースの変更が必要です。これは、いくつかの理由で好ましくありません。たとえば、大きなデータ セットがある場合、テーブルの再構築にかなりの時間がかかることがあります。
これに対する解決策は、可能な値のリストを格納する関連テーブルを使用することです。元のフィールドには、新しいテーブルへの ID 参照が含まれているだけになり、クエリはルックアップ テーブルに結合して文字列値を取得します。これは「正規化」と呼ばれ、優れたデータベース プラクティスと見なされます。これらのルックアップ テーブルが多数あるのは、リレーショナル データベースの典型的なシナリオです。
明らかに、フィールドが「はい」または「いいえ」以外のものを決して格納しないことをかなり確実に気にしている場合、それ用に余分なテーブル全体を用意するのはやり過ぎになる可能性があり、列挙型が適切な場合があります。
一部のデータベース製品はデータ型を提供していないため、enum
これらの DB を使用している場合は、ルックアップ テーブル ソリューション (または単純な数値フィールドを使用し、アプリケーションで値をマップする) を使用する必要があります。
この状況で適切でないのは、テーブル内の実際の文字列値を使用することです。これは非常に貧弱な方法と見なされます。
VARCHARS は、列挙型で使用される数値よりもはるかに多くのディスク領域を占有します。また、読み取りも遅くなり、クエリでの検索も遅くなります。さらに、 によって提供される固定値の強制が削除されenum
ます。これは、プログラムのバグによってデータに無効な値が入力される可能性があることを意味します。また、PHPMyAdmin または同様のツールを使用した不注意による更新も可能です。
それが役立つことを願っています。