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_dataC_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 回答