【问题标题】:One-to-Many relationship in MySQL - how to build model?MySQL中的一对多关系-如何建立模型?
【发布时间】:2013-06-07 08:14:07
【问题描述】:

我有两张桌子:

1) 面积 2) 地图

每个区域应至少有 1 个地图,但也可以有多个地图。

一张地图只能属于一个区域。

如何在 MySQL 中构建它?

【问题讨论】:

    标签: mysql relational-database


    【解决方案1】:
    create table Area(id int primary key auto_increment, name varchar(100));
    
    create table Map(id int primary key auto_increment, 
                     area_id int not null,
                     name varchar(100),
                     foreign key (area_id) references area(id));
    

    SqlFiddle

    每个Map 必须有一个Area,因为area_id 不为空(并且是Area 上的Foreign key

    但是您将无法(并且不希望)为每个区域拥有“至少一张地图”。

    有一天,您必须创建一个Area。此时它不会有任何Map。 或者进行“定期”检查以查看没有任何地图的区域。

    当您删除Map 时,如果Area 没有更多相关的Map,您可能想要删除它。

    【讨论】:

    • 所以:我无法构建这样的东西:一个区域必须有地图?我只能确保一张地图到目前为止有一个区域?
    • @tellob。是的。至少在数据库级别。相反,您可以在应用程序级别管理这种检查。
    • 我知道你来自哪里,但不确定我是否同意。如果对所有项目都遵循此论点,则往往会导致不需要外国关系。我认为最好要求它并处理工作,例如首先创建孩子,然后是父母并在此时分配孩子。因为“有一天”你需要一个空白记录而避免验证过去对我来说效果不佳。
    • @MichaelDurrant 所以 area_id 在地图中必须为 null(able)。你可以有一个没有区域的地图。这只是问题的反转......不是吗?
    • 我真正想要的是,当我想创建一个区域时,我必须告诉一个地图 ID。所以必须先创建地图。另一方面,我希望将多个地图分配给一个区域。真的没有解决方案吗?我看到了交叉引用的问题,所以:如果没有区域,则无法创建地图,并且区域依赖于地图。所以这可能是我猜你的答案中描述的唯一方法?!
    【解决方案2】:

    在 Map 中添加一个引用区域主键的外键。这将在地图和区域之间实施一对多的关系。

    对于每个区域至少执行一张地图(如果有必要),这篇文章here 中有一些想法。一种更简单的解决方案是创建一个仅显示具有地图的区域的视图:

    CREATE VIEW viewAreas AS
    SELECT * 
    FROM Areas, Maps
    WHERE Areas.ID = Maps.AreaID;
    

    这样,您可以创建一个区域,然后向其中添加地图。您还可以强制地图中的外键为 NOT NULL,因此地图必须始终有一个区域。

    【讨论】:

    • 在我看来,事后的触发解决方案 postet 是最合适的。感谢您的回答!
    【解决方案3】:

    地图和区域各有一个表,地图上的外键链接到区域。

    【讨论】:

    • 这意味着,我的地图表中有一个区域 ID?
    • 但这不只是确保地图有一个区域吗?一个区域在创建时也有地图如何安全?
    猜你喜欢
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多