许多外键约束取决于许多表
Many Foreign Key Restraints Depending on Many Tables
注意:由于我对SQL的了解非常有限,所以这个问题可能问得不好。
我们有 3 tables,BUILDINGS,FLOORS,ROOMS .
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 加入任何查询以获取建筑物名称。
注意:由于我对SQL的了解非常有限,所以这个问题可能问得不好。
我们有 3 tables,BUILDINGS,FLOORS,ROOMS .
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 加入任何查询以获取建筑物名称。