注意:由于我对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 这个解决方案还能运作吗?
答案 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表。第二个连接是不必要的,因为您运行的任何查询都可以通过这些表连接以获取建筑物名称。