代码之家  ›  专栏  ›  技术社区  ›  Marco

如果信息很容易确定,请将外键保留为NULL?

  •  1
  • Marco  · 技术社区  · 4 年前

    我有以下表格:

    TABLE country
    (
        country_id int not null,
        name varchar(32) not null,
        primary key (country_id),
        unique key (name)
    );
    
    TABLE place
    (
        place_id int not null,
        name varchar(32) not null,
        country_id int not null,
        primary key (place_id),
        unique key (country_id, name)
    );
    
    TABLE image
    (
        image_id int not null,
        title varchar(75) not null,
        caption varchar(500) not null,
        filename varchar(29) not null,
        country_id int,
        place_id int,
        primary key (image_id),
        unique key (filename)
    );
    

    一个图像可以有一个国家(或没有)或一个地方(或没有。

    假设我在 country 表:

    23 | Spain |
    

    和地方在 place 表:

    3 | Madrid | 23
    6 | Barcelona | 23
    

    我想标记一个 image 与国家 Spain 还有一个地方 Barcelona

    在the 形象 桌子,我应该进去吗 country_id 以及 place_id 或者只是 地点_id 因为国家已经由place_id决定了?

    1 回复  |  直到 4 年前
        1
  •  2
  •   GMB    4 年前

    多态关系不容易在关系数据库中建模。

    在这里,我建议你采取另一种方法:为图像建立两个不同的桥接表——一个用于国家,另一个用于地点。

    这看起来像:

    create table countries (
        country_id int primary key,
        ...
    );
    
    create table places (
        place_id int primary key,
        ...
    );
    
    create table images (
        image_id int primary key,
        ...
    );
    
    create table image_countries (
        image_id   int references images(image_id),
        country_id int references countries(country_id),
        primary key (image_id, country_id)
    );
    
    create table image_places (
        image_id   int references images(image_id),
        place_id   int references places(place_id),
        primary key (image_id, place_id)
    );
    

    然后,您可以自由地将给定的图像链接到任意多的地方和国家。如果你想让每张图片只允许一个国家和一个地方,你可以将每张桥表的主键更改为 image_id .

        2
  •  1
  •   Rick James diyism    4 年前

    改变你的精神焦点。关注与图像相关的“地点”。那就做吧 places 为“西班牙”和“西班牙马德里”工作。不要试图跳过 地点 到达 countries .

    所以,在 地点 ,允许空 name 非空 country 表示“西班牙”。

    我会使用标准的2个字母的国家代码,而不是4字节的INT。然后,我会显示“ES”和西班牙的图像,或者有一个像您当前的查找表 国家 .