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

时间:2015-09-29 14:39:26

标签: mysql sql foreign-keys innodb

注意:由于我对SQL的了解非常有限,因此可能很难问这个问题。

我们有3个表, BUILDINGS FLOORS ROOMS

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

FLOORS 包含以下列:Floor_ID(主键),名称(名称)和Building_ID( BUILDINGS &#39;主键的外键)< / p>

ROOMS 包含以下列:Room_ID(主键),名称(名称),Building_ID( BUILDINGS &#39;主键的外键),以及Floor_ID( FLOORS &#39;主键的外键)

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

如何更正我的结构以确保只能添加​​有效的房间?如果我再次扩展,另一个表 DESKS ,它将具有关联的 BUILDING FLOOR ROOM 这个解决方案还能运作吗?

2 个答案:

答案 0 :(得分:4)

您创建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))
;

Querys

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
;

答案 1 :(得分:1)

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