質問

昨日、Oracle テーブルにブール型フィールドを追加したいと思いました。ただし、実際には Oracle にはブール データ型はありません。ブール値をシミュレートする最良の方法を知っている人はいますか?この件についてグーグルで検索すると、いくつかのアプローチが見つかりました

  1. 整数を使用し、0 または 1 以外のものを代入する必要はありません。

  2. 'Y' または 'N' の 2 つの値のみを含む char フィールドを使用します。

  3. CHECK 制約を持つ列挙型を使用します。

経験豊富な Oracle 開発者は、どのアプローチが推奨されているか、または標準的であるかを知っていますか?

役に立ちましたか?

解決

見つけました これ 便利なリンク。

ここでは、各アプローチの長所と短所のいくつかを強調した段落を示します。

最も一般的に見られるデザインは、Oracleのデータ辞書ビューが使用する多くのブールのようなフラグを模倣し、Trueの「Y」、FALSEの「n」を選択することです。ただし、JDBC、OCCI、その他のプログラミング環境などのホスト環境と正しく相互作用するには、falseを選択し、1つをtrueに対して1つ選択して、GetBooleanおよびSetBooleの関数で正しく動作できるようにすることをお勧めします。

基本的に彼らは、効率性のために、方法 2 を推奨しています。

  • 価値観 0/1 (JDBC との相互運用性のため) getBoolean() など) チェック制約付き
  • ある タイプ CHAR の (使用するスペースが NUMBER より少ないため)。

彼らの例:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

他のヒント

Oracle 自体は、ブール値に Y/N を使用します。完全を期すために、pl/sql にはブール型があり、ブール型を持たないのはテーブルだけであることに注意してください。

レコードを処理する必要があるかどうかを示すためにフィールドを使用している場合は、値として Y と NULL を使用することを検討してください。これにより、占有スペースが非常に少なく、非常に小さい (高速に読み取れる) インデックスが作成されます。

使用するスペースを最小限にするには、「Y」または「N」に制限された CHAR フィールドを使用する必要があります。Oracle は BOOLEAN、BIT、または TINYINT データ型をサポートしていないため、CHAR の 1 バイトは可能な限り小さいです。

最良のオプションは 0 と 1 (数値として) です。別の回答では 0 と 1 を次のように示唆しています。 チャー スペース効率のためですが、それは私にとっては少しひねりすぎます)、NOT NULL とチェック制約を使用して内容をそれらの値に制限します。(列を NULL 可能にする必要がある場合、扱っているのはブール値ではなく、3 つの値を持つ列挙体です...)

0/1 の利点:

  • 言語に依存しません。「Y」と「N」はみんなが使っていれば大丈夫です。しかし、そうではありません。フランスでは「O」と「N」を使います(私はこの目で見てきました)。私はフィンランドで「E」と「K」を使用するかどうかを確認するためにプログラムしたことはありません。彼らがそれより賢いのは間違いありませんが、確信は持てません。
  • 広く使用されているプログラミング言語 (C、C++、Perl、JavaScript) の実践と一致
  • アプリケーション層との連携が向上します。休止状態
  • たとえば、食べごろのバナナの本数を調べるためのより簡潔な SQL につながります。 select sum(is_ripe) from bananas の代わりに select count(*) from bananas where is_ripe = 'Y' あるいは(うん) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

「Y」/「N」の利点:

  • 0/1 よりも占有スペースが少なくなります
  • これは Oracle が提案していることなので、一部の人にとってはこれに慣れているかもしれません

別の投稿者は、パフォーマンス向上のために「Y」/null を提案しました。もしそうなら 証明された パフォーマンスが必要であれば十分ですが、それ以外の場合は、クエリが不自然になるため避けてください(some_column is null の代わりに some_column = 0) そして、左結合では、偽と存在しないレコードを混同してしまいます。

チェック制約のある 1/0 または Y/N のいずれか。どちらの方法でも大丈夫です。Perl で多くの作業を行うため、個人的には 1/0 を好みます。これにより、データベース フィールドで Perl のブール演算を非常に簡単に行うことができます。

この質問についてオラクルの責任者と本当に深く議論したい場合は、Tom Kyte がこれについて何と言っているかを確認してください。 ここ

私が作業したほとんどのデータベースでは、ブール値として「Y」/「N」を使用していました。この実装を使用すると、次のようなトリックを実行できます。

  1. true である行をカウントします。
    SELECT SUM(CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X

  2. 行をグループ化するときは、「1 つの行が true であれば、すべてが true」というロジックを適用します。
    Y から MAX(BOOLEAN_FLAG) を選択
    逆に、1 つの行が false の場合、MIN を使用してグループ化を強制的に false にします。

Oracle データベース内の既存のテーブルに「ブール」列を追加することで受け入れられた回答を実装する実際の例 (次を使用) number タイプ):

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

これにより、新しい列が作成されます my_table_name 呼ばれた my_new_boolean_column デフォルト値は 0 です。この欄は受け付けません NULL 値を指定し、受け入れられる値を次のいずれかに制限します。 0 または 1.

私たちのデータベースでは、TRUE または FALSE を確実に渡す列挙型を使用します。最初の 2 つの方法のいずれかを実行すると、適切な設計を経ずに整数に新しい意味を追加し始めるか、Y、y、N、n、T、t を持つ char フィールドで終わるかのどちらかが簡単に起こります。 F、f の値と、コードのどのセクションでどのテーブルが使用され、どのバージョンの true が使用されているかを覚えておく必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top