数据库中的一对多关系

当表A中的每条记录在表B中可能有许多链接记录时,数据库中会出现一对多关系 ,但表B中的每条记录在表A中可能只有一条对应记录。数据库是最常见的关系数据库设计,是良好设计的核心。

考虑一下老师和他们教授的课程之间的关系。 一位老师可以教授多门课程,但课程与老师的关系不一样。

因此,对于“教师”表中的每条记录,“课程”表中可能有许多记录。 这是一对多的关系:一个老师到多个课程。

为什么建立一对多关系很重要

要表示一对多关系,至少需要两个表。 让我们看看为什么。

也许我们创建了一张教师表,我们想记录教授的名字和课程。 我们可以这样设计它:

教师和课程
Teacher_ID 老师的名字 课程
Teacher_001 卡门 生物学
Teacher_002 维罗尼卡 数学
Teacher_003 乔治 英语

如果卡门教授两门或两门以上课程会怎么样? 这种设计有两种选择。 我们可以将它添加到卡门现有的记录中,如下所示:

教师和课程
Teacher_ID 教师 _姓名 课程
Teacher_001 卡门 生物学,数学
Teacher_002 维罗尼卡 数学
Teacher_003 乔治 英语

然而,上面的设计不够灵活,以后在尝试插入,编辑或删除数据时可能会导致问题。

这使得难以搜索数据。 这种设计违反了数据库标准化的第一个原则,即第一范式(1NF) ,该原则规定每个表格单元应包含单个离散的数据片段。

另一种设计方案可能是简单地为卡门添加第二条记录:

教师和课程
老师 _ID 教师 _姓名 课程
Teacher_001 卡门 生物学
Teacher_001 卡门 数学
Teacher_002 维罗尼卡 数学
Teacher_003 乔治 英语

这符合1NF的要求,但数据库设计仍然很差,因为它引入了冗余,并且可能会不必要地膨胀一个非常大的数据库。 更重要的是,数据可能会变得不一致。 例如,如果卡门的名字改变了怎么办? 有人使用这些数据可能会将她的名字更新为一条记录,并且无法在第二条记录中对其进行更新。 这种设计违反了第二范式(2NF),其遵守1NF,并且还必须通过将数据子集分成多个表并且在它们之间建立关系来避免多个记录的冗余。

如何设计具有一对多关系的数据库

要在教师和课程表中实现一对多关系,我们将表分成两部分,并使用外键将它们链接起来。

在这里,我们已经移除了教师表中的课程列:

教师
老师 _ID 教师 _姓名
Teacher_001 卡门
Teacher_002 维罗尼卡
Teacher_003 乔治

这是课程表。 请注意,其外键Teacher_ID将课程链接到Teachers表中的教师:

培训班
COURSE_ID 课程名 Teacher_ID
Course_001 生物学 Teacher_001
Course_002 数学 Teacher_001
Course_003 英语 Teacher_003

我们使用外键在教师和课程表之间建立了关系。

这告诉我们,卡门教授生物学和数学,而乔治教英语。

我们可以看到这个设计如何避免任何可能的冗余,允许个别教师教授多门课程,并实现一对多的关系。

数据库也可以实现一对一的关系和多对多的关系。