2012-06-04 38 views
6

数年前、私は第三者によって開発されたシステムのDBスキーマを見て、boolean(tinyint)フィールドの代わりにenum( 'y'、 'n')を使用していることに気付きました。なぜ私はそれが大好きだったのか分かりませんが、私は物事を読みやすくすることを知っていました。私はそれを採用し、それ以来それを使用し始めました。私は "真"と "偽"のためにそれを交換することができると思いますが、私はそれを好きでした。MySQLテーブルのブール値フィールドの代わりにenum( 'y'、 'n')を使用するのは悪いですか?

このように、ゲームの後半に入ってくるプログラマーを少し迷惑をかけることを除いて、このように何かをやり遂げることには何らかの挫折がありますか?

+3

なぜこれを閉じるには?これは正当な質問です –

+0

私はそれがhttp://programmers.stackexchange.comに属していて、閉鎖されているとは思いません。 – lanzz

答えて

9

はい、それは悪いです。直感的なブール論理を失うと(SELECT * FROM user WHERE NOT bannedSELECT * FROM user WHERE banned = 'n'になります)、アプリケーション側でブール値の代わりに文字列を受け取るため、ブール値の条件も面倒になります。あなたのスキーマを扱う他の人たちは、フラグのような列名を見てブール論理を使用しようとすると、噛まれるでしょう。

-2

私はそれが愚かだと思う - ちょうどbooleanタイプを使用してください - それはそうです。

しかし、「多分」「おそらく」のような「ファジー」値のためにドアを開いたままにしておくとします。

+0

enum( 'y'、 'n'、 'p'、 'm')? :) lanzzが既に共有していることを除いて、それがなぜ馬鹿げているのかという建設的な理由はありますか?私は列挙型が9のような値を許可するtinyintとは対照的にtrue/falseであることを言及するいくつかの質問を読みました。 – Gazillion

+0

'9'の値は、' NOT'が 'false'であるため、' true'をうまく表現しています。一方、「NOT」と「NOT」は「真」であり、意味をなさない。 – lanzz

1

としてはthe manualで説明:

をあなたは(すなわち、許容値のリストに存在しない文字列である)ENUMに無効な値を挿入した場合、空の文字列ではなく、特殊なエラーとして挿入されています値。この文字列は数値が0であるため、通常の空の文字列と区別できます。列挙値の数値インデックスの詳細については、Section 11.4.4, “ Index Values for Enumeration Literals ”を参照してください。

厳密なSQLモードが有効な場合、無効なENUM値を挿入しようとするとエラーになります。この点において

BOOLEANタイプとは異なる挙動でENUM結果。そうでなければ、私は@lanzz's answerに同意する傾向があります。これは少し直接的ではないアプリケーションとの統合を可能にします。

0

元のスキーマを書いた人がMySQLに制限するかどうかは、考慮する必要があります。 MySQLだけで動作させることを意図しているのであれば、MySQLに適応することは理にかなっています。同じスキーマを他のDBMSで使用できるようにするには、関連するすべてのDBMSで機能するより包括的なスキーマ設計が、設計を行う人にとってよりよい場合があります。

ということで、enumが適度にMySQLの特定のですが、enumと同等の何かが簡単に他のDBMSに作成することができます。

CREATE TABLE ... 
(
    ... 
    FlagColumn CHAR(1) NOT NULL CHECK(FlagColumn IN ('y', 'n')), 
    ... 
); 

異なるDBMSはあなたがしたいようBOOLEANが均一でない扱いする方法SQL標準にもかかわらず(その理由は過去のものであり、これまでの歴史であり、適合していないシステムは標準よりも前にBOOLEANのテーマを変更しており、その実装を変更すると既存の顧客のコードが破られる)。

したがって、booleanよりもenumの使用を自動的には非難しませんが、ブール値フラグにはbooleanを使用することをお勧めします。

関連する問題