【问题标题】:Many Foreign Key Restraints Depending on Many Tables许多外键约束取决于许多表
【发布时间】:2015-12-27 02:32:01
【问题描述】:

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

我们有 3 张桌子,BUILDINGSFLOORSROOMS

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

FLOORS 包含以下列:Floor_ID(其主键)、Name(其名称)和 Building_ID(BUILDINGS 主键的外键)

ROOMS 包含以下列:Room_ID(其主键)、Name(其名称)、Building_ID(BUILDINGS 主键的外键)和 Floor_ID(外键) FLOORS的主键)

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

如何更正我的结构以确保只能添加​​有效房间?如果我再次向外扩展,另一个表 DESKS 将具有关联的 BUILDINGFLOORROOM > 这个解决方案还能用吗?

【问题讨论】:

  • 1.规范化:ROOMS 表不需要“Building_id”,因为 FLOORS 表已经存在这种关系。 2.一个楼层只能属于一个建筑物:需要在FLOORS表中定义一个复合唯一索引(Floor_id, Building_id)。

标签: mysql sql foreign-keys innodb


【解决方案1】:

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

【讨论】:

  • 啊,这很有道理。谢谢,这让我感到恐惧和困惑。最终解决方案非常实用!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 2011-05-30
    • 2021-05-22
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多