web-dev-qa-db-ja.com

データベースでのブール値の使用

Visual Studio 2013、.Net 4.5、SQL Management Studio 2012を使用しています。データベースにオフィスを追跡するテーブルがあります。アプリケーション側には、オフィスのレイアウトに関するいくつかの表示ルールがあります。建物が改造されると、オフィスの名前が変更され、古いオフィスが非アクティブになる可能性があります。履歴アイテムを追跡するために、非アクティブなオフィスを削除しないことが重要です。

データベーステーブルにブール列を配置して、オフィスがアクティブかどうかを判断しました。列isActiveTrueと等しい場合、オフィスを選択してアイテムを追加できます。

私の同僚の1人は、データベースでブール型フィールドを使用することに非常に反対していますが、それらを使用してはならない理由について確固たる理由を提供できていません。 「やらない」「使いづらい」と言われてきましたが、あまり充実しているとは思いません。データベースが最初にブール値を持つようにセットアップされ、フィールドにオプションが追加されたという状況に彼は遭遇したと思います(trueはfalse、今はA、B、Cのいずれかになります)。ブール値の代わりに「Y」または「N」を使用してvarChar(1)を使用することが推奨されています。

だから私が疑問に思っているのは、オフィスが「アクティブ」または「非アクティブ」以外の何かになる方法がないというシナリオを考えると、この値をブール値として表すことを避けるべき理由があるのでしょうか。

7
rogerdeuce

私はあなたの同僚に、boolが最終的にtrueまたはfalseを超える可能性がある可能性について指摘します。しかし、私はvarcharルートに向かうに対してを強くお勧めします。有効な値を持つルックアップテーブルと、有効な値に一意の制約があるinteger id、またはコメント/その他の回答で提案されている列挙型のいずれかを使用してください。

「一見したところ」boolサウンドフィールドがデータベース全体にありますが、実際には文字列です。 4層のアプリケーションでは、層を介して文字列パラメーターが渡されるため、(潜在的に)文字列の「有効な」値が何かはわかりません。

例:

useMaster varchar(1).

これは文字列よりもboolの方がはるかに適していると思います。私の場合は「マスター」または「トランザクション」です。ただし、varcharを使用しているので、マスターを示すと予想されるproc 4層のダウンは何ですか? UIから何もわかりません。「はい」ですか?それは本当の「T」ですか?もしどちらかを推測したとしたら、それはマスタの "M"だったので間違っていたでしょう。私の場合、基本的に:

If (@userMaster = 'M')
    // use master
else
    // use transaction

私が想像したどの選択肢も、私が望むようにmasterを取得するための有効な値ではありませんでした。 4層のコードをドリルダウンして、プロシージャが実際に期待していたものを特定する必要があります。

魔法の文字列bad使用しないことを強くお勧めします。

9
Kritner

この値をブール値として表すことを避けなければならない理由はありますか?

番号。

あなたが説明した状況を考えると、ブール値はアクティブ/非アクティブ状態の良い候補です。

代替:

ただし、アクティブステータスの記録にはタイムスタンプ/日時フィールドを使用することをお勧めします。使用されていないオフィスの履歴を保持したいとおっしゃっていました。 null値を許可するdatetime型のactiveToという列がある場合、そのフィールドを使用してオフィスがまだ有効かどうかを確認できます。

  • nullまたは将来の日付がアクティブです。
  • 過去の日付は非アクティブです。

これにより、オフィスがいつ非アクティブになったかを知ることができます。

代替2:

すべてのオフィスを1つのテーブルに保持し、アクティブなオフィスを表す別のテーブルを用意することもできます。 ID列だけです。 JOINを使用して、非アクティブなテーブルを除外できます。私はこのアプローチを使用していないため、見逃している問題があるかどうかわかりません。

代替3:

他の誰かが提案したように、オフィスの状態のすべての可能な値を保持するテーブルを追加できます。これにより、さまざまな方法で可能性を更新し、YまたはTだけではなく、より意味のある表現をユーザーに提供できます。

いくつかの選択肢を検討し、あなたができる最善の推測をすることをお勧めします。それらにはすべて利点とトレードオフがあります。コンテキストとバランスが重要です。

4

2つの値のいずれかであるvarchar(1)の使用はdaftです-これがbitフィールドの目的です。

ただし、要件が常に変化し、追加のステータス値が必要な場合は、コードで列挙型を使用して、値を整数として保存することをお勧めします。このようにすると、新しい値を保存するためにデータベース構造を変更する必要がなくなります。

3
user1666620