当前位置:首页 > 问答 > 正文

关系数据库里实体怎么关联起来,感觉有点绕但其实也没那么复杂

说到关系数据库里实体怎么关联,很多人一开始会觉得脑袋里一团乱麻,又是主键又是外键,还有各种一对多、多对多,听起来特别技术,特别绕,但其实你仔细想一下,这玩意儿跟我们生活中管理信息的方式几乎一模一样,只不过是用了一种更严谨、不会出错的方法把它固定下来了,咱们今天就不说那些专业术语,就用大白话把它讲明白。

想象一下,你是一个班主任,要管理一个班级的学生信息,你手里有一个花名册,这个花名册就是一个“实体”,我们可以叫它“班级花名册表”,这个表里每一行是一个学生,记录了每个学生的学号、姓名、性别、出生日期等等,在这里面,“学号”是最关键的一个信息,因为一个学号只对应一个学生,绝对不会重复,这个“学号”,在数据库里就叫“主键”,主键就是一个实体的唯一身份证,靠它就能精准地找到“这一个”学生。

好,现在学校说要开始管理学生借书的情况了,你需要另一个本子来记录,这个本子就是“图书借阅记录表”,这个表也是实体,里面要记:哪天、哪个学生、借了哪本书、什么时候还。

问题来了:你在“图书借阅记录表”里,该怎么记录“哪个学生”呢?

第一种笨办法:把学生的所有信息再写一遍,学号001的王小明借了一本书,你就在借阅记录里写上:“王小明,男,2005年3月2日生...借了《三国演义》”,这样行吗?看似行,但问题太大了,第一,太啰嗦,重复写很多信息,浪费本子,第二,最容易出错,万一你笔误,把“王小明”写成了“王明”,那以后统计王小明借了多少本书的时候,这条记录就丢了,第三,如果王小明转学了,你要在所有他借过书的地方把他的信息都找出来删掉或修改,这简直是不可能完成的任务。

第二种聪明办法(也就是数据库的方法):在“图书借阅记录表”里,你只记一样东西——学生的学号,就写“001,《三国演义》,2023-10-27”,这样一来,记录非常简洁,当你想知道是谁借的这本书时,你拿着这个“001”的学号,去翻看“班级花名册表”,一对照,哦,原来是王小明,这个在借阅记录表里使用的、指向另一个表(花名册表)主键的“学号”,在数据库里就叫“外键”。

你看,这个“关联”就这么建立起来了。“班级花名册表”的主键(学号),跑到了“图书借阅记录表”里做了外键(学号)。 通过这个学号,两个原本独立的表就联系起来了,这种关系,就是最最常见的一种,叫做“一对多”关系,什么意思?就是一个学生(“一”这边)可以有多条借阅记录(“多”这边),但一条借阅记录只能属于一个学生,这很符合现实吧?

那“多对多”关系又是什么情况呢?咱们继续用这个例子。

现在情况变了,学校课程丰富了,一个学生可以选修多门课,比如王小明可以同时选修数学和物理;一门课也可以被多个学生选修,比如数学课同时有王小明、张小红、李小白一起上,这该怎么记录?

你可能会想,在“学生表”里加一列“选修课程”,写上“数学,物理”,但这样问题又来了:你怎么统计选修“数学”课的所有学生?你得把每个学生记录打开,一个一个看里面有没有“数学”这个词,这效率太低了,而且如果课程信息有变动,又要改一大堆地方。

数据库的解决办法是:再创建第三个表,专门用来“搭桥”

我们还是有两个核心实体表:

  1. 学生表:学号(主键),姓名...
  2. 课程表:课程号(主键),课程名...

我们创建一个“搭桥”表,就叫“学生选课表”: 3. 学生选课表:id(这个可以没有,或者用学号+课程号一起做主键),学号(外键,指向学生表),课程号(外键,指向课程表)。

这个表里就存非常简单的记录: 学号001, 课程号M001 (表示王小明选了数学) 学号001, 课程号P001 (表示王小明选了物理) 学号002, 课程号M001 (表示张小红选了数学)

你看,这样一来,关系就清晰了,你想知道王小明选了哪些课?就去“学生选课表”里找出所有学号是001的记录,得到课程号M001和P001,再去“课程表”里一查,就知道是数学和物理,你想知道数学课有哪些学生?就去“学生选课表”里找出所有课程号是M001的记录,得到学号001和002,再去“学生表”里一查,就知道是王小明和张小红。

这就是“多对多”关系,它需要通过一个中间表(搭桥表)来实现,这个中间表里一般至少有两个外键,分别指向关联的两个表。

总结一下,数据库里关联实体一点也不神秘:

  1. 核心是主键和外键:主键是实体的唯一标识,外键是“指向别人家主键的指针”。
  2. “一对多”关系:最直接,把“一”那方的主键,放到“多”那方作为外键,比如班级对学生(一个班级有多个学生,学生在表里有个外键“班级ID”指向班级表)。
  3. “多对多”关系:需要个“中间人”(搭桥表),这个表记录两个外键,分别指向两个实体,比如学生和课程,产品和订单等。

你之所以觉得绕,可能是因为一下子接受了主键、外键、一对多、多对多好几个概念,但只要你抓住“主键是身份证,外键是介绍信”这个本质,然后把它套回到生活中管理信息的场景里,比如花名册、借书卡、选课单这些你非常熟悉的东西上,就会发现,数据库只不过是把你觉得理所当然的正确做法,用严格的规则落实下来了而已,目的是为了高效、准确、不重复,这么一想,是不是就觉得清晰多了,也没那么复杂了?

关系数据库里实体怎么关联起来,感觉有点绕但其实也没那么复杂