2011-03-13 3 views
1

Oracleを使用しています。複数の表の順序オブジェクトを使用して結合時の問合せ性を保証する

キャット(CAT_ID、cat_name、cat_age、cat_strength)

犬(dog_ID、dog_name、dog_age)

時々私は1つのクエリの結果に、すべてのペットを取得する必要があります:私は2つのテーブルを持っています。私はcatとdogテーブルの両方で使用できるanimal_seqシーケンスを作成することを考えていたので、テーブル間でIDが重複しないようにして、結合されたときに簡単に検索/照会できます。

この悪い習慣ですか?もしそうなら、なぜですか?テーブルを設計するより良い方法がありますか(例えば、ただ1つのAnimalテーブル、または複数の継承)。個人的には、ジョインのパフォーマンス上の問題のために継承を避けようとしています。

答えて

4

1つの配列を持つことは完全に許容され、安全です。 Oracleは、シーケンスへの複数の読込みが常に一意の値を返すようにするため、重複したキーには問題はありません。

CATとDOGの間のスキーマが本当にユニークで、追加の動物エンティティもユニークであれば、別のテーブルを保持します。あなたが猫、犬、猿などについて同じ情報を維持しようとしている場合は、それらを単一のANIMALテーブルに入れることをお勧めします。何が推奨されるかを知るためには、アプリケーション/データベースに関する詳細情報を提供する必要があります。

+0

猫にはスクラッチポールテーブルへの外部キーがあります(私はこのすべてをbtwにして、無実を守るために名前を代用しています)。犬は犬のケンネルテーブルに外来キーを持っています。所有者(ペットの)は、犬舎やスクラッチポールを購入することができます。 – BobTurbo

+1

ええと...これは、ANIMALテーブル、PRODUCTテーブル、およびANIMAL_PRODUCT_XREFテーブルがあると考えられます。 ANIMAL_PRODUCT_XREFは、ANIMAL_IDをPRODUCT_IDに結合する相互参照テーブルです。この方法で、複数の動物が複数の製品を利用できるようになります。 –

1

あなたの現在のデザインでは、鳥や兎や他の動物を記録したい場合はどうすればいいですか?各タイプのテーブルを作成する必要があります。

私は、KISS(原則として愚かな)原則を使用して1つのテーブルを持ち、ANIMAL_TYPE(animal_type_id、Animal_type_name)という別のテーブルに結合すると、IDが重複しないようにすることができます。他の動物種を記録する。

+0

犬が強度属性(例えば)を持たないので、問題はヌル値がたくさんあることです。しかし、私はまだその選択肢を検討しています。 – BobTurbo

+0

確かに犬には力があります:)。あなたのデザインは将来的に証明されるであろうヌル値がたくさんあるかもしれません。どのようにあなたの結合をやっていますか? –

+0

@BobTurbo:Oracleは1バイトのみを使用してNULLを格納し、後続のNULLは1行に格納する必要がないことに注意してください。だから、疎なテーブルについては論理的な懸念があるかもしれませんが、テーブルが大きすぎるために迷惑をかけるなど、物理的な問題は多くの人が想定するほど悪くありません。 –

1

私はあなたがベーステーブル、animalを探していると思います。次に、2つのサブクラスcatdogがあります。そのようなデザインは、その動物の「所有者」や「動物観察」などの情報を追加したり、アプリケーションの目的が何であれ、役立ちます。サブクラステーブルのサブクラスの特定の属性を維持しながら

table animal(
    animal_id 
    ,animal_type <-- Discriminator column with for example C for cat, D for dog 
    ,name 
    ,age 
    ,primary key(animal_id) 
) 

table cat(
    animal_id 
    ,cat_strength 
    ,primary key(animal_id) 
    ,foreign key(animal_id) references animal(animal_id) 
) 

table dog(
    animal_id 
    ,dog specific attributes here 
    ,primary key(animal_id) 
    ,foreign key(animal_id) references animal(animal_id) 
) 

あなたが見ることができるように、私は、ベーステーブルanimalに共通の属性を上に移動しました。

+0

私がこれを持っている問題は、すべての単一の挿入が2つの挿入を必要とし、すべての単一のクエリが何百万もの結合を必要とするということです。これがオブジェクトであればこれがどのように行われるのでしょうが、oopがデータベースでうまく動作するかどうかはわかりません。 – BobTurbo

+0

パフォーマンスのペナルティは最小限に抑えられ、ウェブスケールの素晴らしいソースプロジェクトでのみ顕著です。データベースが整合性の制約のすべてまたはほとんどを実行し、後でパフォーマンスについて心配する、きれいで表現力豊かなモデルを作成してください。テーブルの結合もnrも特定のパフォーマンス上の問題に顕著な影響を与えないことがわかります。 – Ronnis