一对多数据库中的关系当表A中的每个记录可能在表B中具有许多链接记录时,就会发生,但是表B中的每个记录可能在表A中只有一个相应的记录。数据库中的一对一关系是最常见的关系数据库设计和是良好设计的核心。
考虑老师与他们教的课程之间的关系。老师可以教多个课程,但是该课程与老师没有相同的关系。因此,对于教师表中的每个记录,课程表中可能有很多记录。这是一对一的关系:一门老师到多个课程。
为什么建立一对多关系很重要
为了表示一对多的关系,您至少需要两个表。让我们看看为什么。
也许我们创建了一张桌子,我们想在其中记录所教的名称和课程。我们可能会这样设计:
老师_id | 老师的名字 | 课程 |
---|---|---|
conters_001 | 卡门 | 生物学 |
conters_002 | 维罗妮卡 | 数学 |
conters_003 | 乔治 | 英语 |
如果卡门教两门或更多课程怎么办?我们有两个选择。我们可以将其添加到卡门的现有记录中,这样的记录:
老师_id | 老师_姓名 | 课程 |
---|---|---|
conters_001 | 卡门 | 生物学,数学 |
conters_002 | 维罗妮卡 | 数学 |
conters_003 | 乔治 | 英语 |
但是,上面的设计是不灵活的,并且在尝试插入,编辑或删除数据时可能会导致问题。这使得很难搜索数据。该设计违反了数据库归一化的第一个原理,首先正常形式(1NF),其中指出每个表单元格应包含一个离散的数据。
另一种设计替代方法可能是简单地为卡门添加第二个记录:
老师_ID | 老师_姓名 | 课程 |
---|---|---|
conters_001 | 卡门 | 生物学 |
conters_001 | 卡门 | 数学 |
conters_002 | 维罗妮卡 | 数学 |
conters_003 | 乔治 | 英语 |
这遵循1NF,但数据库设计仍然很差,因为它引入了冗余,并且可能不必要地膨胀一个非常大的数据库。更重要的是,数据可能不一致。例如,如果卡门的名字更改了怎么办?使用数据工作的人可能会在一个记录中更新她的名称,并且无法在第二个记录中更新它。该设计违反了第二个正常形式(2NF),该形式(2NF)遵守1NF,还必须通过将数据子集分为多个表并在它们之间建立关系来避免多个记录的冗余。
如何设计具有一对多关系的数据库
为了在教师和课程表中实现一对多的关系,我们将桌子分为两者,并使用一个外键。
在这里,我们删除了教师表中的课程专栏:
老师_ID | 老师_姓名 |
---|---|
conters_001 | 卡门 |
conters_002 | 维罗妮卡 |
conters_003 | 乔治 |
这是课程表。请注意,其外国钥匙contercy_id将课程链接到教师表中的老师:
course_id | 课程名 | 老师_id |
---|---|---|
课程_001 | 生物学 | conters_001 |
课程_002 | 数学 | conters_001 |
课程_003 | 英语 | conters_003 |
我们已经使用外国钥匙建立了教师和课程表之间的关系。这告诉我们,卡门教授生物学和数学,豪尔赫教英语。
我们可以看到这种设计如何避免任何可能的裁员,允许单个老师教多个课程,并建立一对一的关系。
数据库还可以实现一对一的关系和多对多的关系。