如何在一个表中插入多个外键?

Posted

技术标签:

【中文标题】如何在一个表中插入多个外键?【英文标题】:How to insert multiple foreign keys into a table? 【发布时间】:2022-01-19 09:23:31 【问题描述】:

我是 SQL 新手,开始尝试清理数据集。这是我的原始表 (movies_details)

ID  movie     release_year       genre              actors
---------------------------------------------------------------------
1   Movie_A   2010               Romantic, Comedy   Actor_A, Actor_B   
2   Movie_B   2011               Documentary        Null
3   Movie_C   2010               Comedy, Horror     Actor_A, Actor_C
4   Movie_D   2020               Documentary        Actor_B

我相信我首先需要创建一个满足 1NF 的新表,即创建原子值。所以我创造 3 个新表

movie表:

movie_ID    movie     release_year
----------------------------------
m_1         Movie_A    2010
m_2         Movie_B    2011
m_3         Movie_C    2010 
m_4         Movie_D    2020

genre表:

genre_ID    genre    
---------------------
g_1         Romantic
g_2         Comedy
g_3         Documentary
g_4         Horror 

actor表:

actor_ID    actors
--------------------
a_1         Actor_A
a_2         Actor_B
a_3         Actor_C

我知道对于每个表,我们都需要一个外键链接到数据库中的所有表。我的问题是,一旦我为每个新表分配了一个外键,就会再次出现不满足 1NF 的问题。例如,如果我将外键添加到流派表中,它将是 如:

genre_ID    genre         movie_ID     actor_ID
-----------------------------------------------------
g_1         Romantic      m_1          a_1, a_2
g_2         Comedy        m_1, m_3     a_1, a_2, a_3  
g_3         Documentary   m_2          Null, a_2
g_4         Horror        m_3          a_1, a_3

如果我向每个表添加外键,它会变得更加复杂。我该如何修复这个 genre 表,因为 1NF 问题似乎无法以这种方式解决?

【问题讨论】:

不,您不需要为数据库中的每个表添加外键。每个表都需要一个与它相关的表的外键。当您分析主题时,您需要了解实体以及它们之间的关系。这将告诉您需要哪些外键。 【参考方案1】:

您要建模的是两个多对多关系,因此您需要为每个关系实现一个关联表。

    MovieGenre 与 FK 到电影和类型 MovieActor 与电影和演员的 FK

两个表中的主键是 FK 的组成。

【讨论】:

【参考方案2】:

到这里为止,您需要在设计中添加另外两个表格。 N : M 关系的原因是你的movie_table 表和genre_table 表之间的关系,你需要把这个关系分解成Table_XYZ 表来保持这两个表之间的关系,它的结构如下所示:

Table_XYZ
movie_ID    genre_ID
m_1         g_2
m_1         g_1
m_2         g_3

另外,movie_table 表和actor_table 表之间存在N:M 关系,您需要添加Table_MNO,它会像:

Table_MNO
movie_ID    actor_ID
m_1         a_2
m_1         a_1
m_2         a_3
m_2         a_1
m_2         a_5

【讨论】:

以上是关于如何在一个表中插入多个外键?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SSIS 将多个表中的数据插入到多个表中?

如何将数据插入到通过外键相关的两个表中?

如何在java jframe表中插入递增的主键和外键?

如何使用 rest api 在休眠状态下插入表中,并且在该表 2 列上是另一个表的外键?

如何在DJANGO里,向有外键的DB里插入数据

在 Hibernate 中,如何自动检索父 id 并在子插入中将其用作外键?