许多外键约束取决于许多表

Many Foreign Key Restraints Depending on Many Tables

注意:由于我对SQL的了解非常有限,所以这个问题可能问得不好。

我们有 3 tables,BUILDINGSFLOORSROOMS .

BUILDINGS 包含列:Building_ID(其主键)和名称(其名称)

FLOORS 包含列:Floor_ID(它的主键)、Name(它的名字)和 Building_ID([=24 的外键=]BUILDINGS'主键)

ROOMS 包含列:Room_ID(它的主键),Name(它的名字),Building_ID([=24= 的外键]BUILDINGS' 主键)和 Floor_ID(FLOORS' 主键的外键)

我的问题是,如果我有1号楼和2号楼,1号楼和2号楼两层,如果1号楼属于1号楼,2号楼属于2号楼(即2号楼没有楼层) 1,并且 1 号楼没有楼层 2) 可以添加一个位于 1 号楼 2 楼的房间,即使这不应该存在。

如何更正我的结构以确保只能添加​​有效的房间?如果我再次向外扩展,另一个 table DESKS 将具有关联的 BUILDING, FLOOR,以及 ROOM 这个解决方案是否仍然有效?

您创建了 3 个表。房间只需要参考楼层。浏览楼层你会知道建筑物

CREATE TABLE Building
    (`building_id` int, `name` varchar(6))
;

CREATE TABLE floor
    (`floor_id` int, `building_id` int, `name` varchar(7))
;

CREATE TABLE room
    (`room_id` int, `floor_id` int, `name` varchar(9))
;

查询

SELECT *
FROM Building;

SELECT *
FROM Building B;
INNER JOIN floor F 
    ON B.building_id = F.building_id
;

SELECT *
FROM Building B;
INNER JOIN floor F     
    ON B.building_id = F.building_id
INNER JOIN Room R
    ON F.room_id = R.room_id
;

并且 DESKS

CREATE TABLE desks
    (`desk_id` int, `room_id` int, `name` varchar(9))
;

SELECT *
FROM Building B;
INNER JOIN floor F     
    ON B.building_id = F.building_id
INNER JOIN Room R
    ON F.floor_id = R.floor_id
INNER JOIN Desk D
    ON R.room_id = D.room_id
;

问题是标准化问题。在您的 ROOMS table 中,不要包含外键 Building_ID。 ROOM 和 BUILDINGS 之间的连接是通过 FLOORS table。不需要第二个连接,因为您 运行 可以通过这些 table 加入任何查询以获取建筑物名称。