4

つまり、次のスキーマがある場合:

create table tableA(
    A_id   number not null primary key
);

create table tableB(
    B_id   number not null primary key,
    A_id   number not null references tableA(A_id),
    B_data text   not null
);

create table tableC(
    C_id   number not null primary key,
    A_id   number not null references tableA(A_id),
    C_data text   not null
);

B_dataここで説明されている関係を取得して使用したい場合、次の間にC_data違いはありますか?

select
    b.B_data,
    c.C_data
from
    tableB b
    inner join tableC c
        on b.A_id = c.A_id;

と:

select
    b.B_data,
    c.C_data
from
    tableB b
    inner join tableA a
        on b.A_id = a.A_id
    inner join tableC c
        on a.A_id = c.A_id;

ほとんどのデータベースはどちらのクエリも同じになるように最適化すると思いますが、外部キーの制約により、tableA経由での結合がtableAはるかに効率的になる場合がありますか?これらのクエリが異なる結果を生成する可能性がある場合はありますか?

4

2 に答える 2

2

直接参加することもできます。外部キー制約は、結合をより効率的にするために何もしません。インデックスはそれを行いますが、これは(DBMSによっては)外部キーとは別の問題である可能性があります。いずれにせよ、使用するインデックスがある場合は、外部キーを使用しているかどうかに関係なく、インデックスを使用できます。

于 2009-07-29T11:52:58.117 に答える
1

最初のバージョンは正常に動作します。外部キー関係は参照整合性に関するものであり、定義されているとおりにトラバースする必要はありません。

于 2009-07-29T11:52:15.217 に答える