前言

        在数据库中,表和表之间也存在一定的关系,并且这些关系可以用E-R图来呈现

一、数据表之间的关系

        表与表之间有多种关系:一对一、一对多、多对多,当然还有无关系,这个就不提了

1.一对一

        例如:班主任表和班级表,一个班级只有一个班主任,一个班主任只会管理一个班级

        创建了班级表和班主任表,怎么描述两个表之间的关系呢?设置一个关联字段,将一张表的主键添加到另一张表当中,这个关联字段设置在那张表里都可以

2.一对多

        例如:班级表和学生表,一个班级有多个学生,但是一个学生只能属于一个班级

        创建了班级表和学生表,如何描述两个表之间的一对多的关系呢?将关联字段放在多对应的表里面,如果放在一对应的表里面,那么每个班级对应的学生id列就会包含多个值,这样不符合建表的规则,因此只能放在多表那边

3.多对多

        多对多的关系其实是很常见的,比如,学生在选课的时候,会选择多门课程,一门课程被多个学生选择

        创建了学生表和课程表,要如何设置多对多的关系呢?在一对多里面提到不能放在一表这边是因为一个属性可能会包含多个值,这里也一样,一个学生对应的课程有多个,不能放在学生表这边,课程包含的学生也有多个,也不能放在课程表这边,因此我们需要单独建一个关系表也叫映射表

        映射表用来存放两张表的有关联的属性(一般是主键)

4.设计

        在描述表之间的关系后,还可以使用E-R图来清晰的看出表与表之间的关系

二、概念结构设计E-R图

1.什么是概念结构设计?

        概念结构设计是数据库设计的第一步,作用是:不关心数据库、不关心表、不关心字段类型,只用最直观的方式描述业务里有哪些数据、它们之间是什么关系

        它的标准方法就是:E-R 图(实体 - 联系图)

2.数据库设计的基本流程

概念结构设计是数据库开发的关键阶段,主要任务是将用户需求抽象为信息结构(E-R模型)。

  • 需求分析:明确数据范围、用户操作及约束条件。
  • 概念设计:通过E-R图描述实体、属性和关系。
  • 逻辑设计:将E-R图转换为关系模式(如表结构)。
  • 物理设计:优化存储结构、索引等实现细节。

3.E-R模型核心要素

(1)实体(Entity)
        表示独立存在的对象,如“学生”、“课程”。实体用矩形表示,属性用椭圆表示。

(2)属性(Attribute)

  • 简单属性:不可再分(如学号)。
  • 复合属性:可拆分为更小单元(如地址包含省、市)。
  • 派生属性:通过计算得到(如年龄根据出生日期推算)。

(3)关系(Relationship)
        描述实体间的关联,用菱形表示。

  • 一对一(1:1):如“学生”与“学籍档案”。
  • 一对多(1:N):如“班级”与“学生”。
  • 多对多(M:N):如“学生”与“课程”需通过中间表实现。

结合E-R图来认识这三种关系:

  • 一对一关系(1:1):记录之间一一对应,例如上图的学生和饭卡之间的关系,一个学生有一张饭卡,一张饭卡属于一个学生,两者一一对应;

  • 一对多关系(1:n):一个表中的记录可以与另一个表中的多条记录关联,例如办公室和饭卡之间的关系,一张饭卡属于特定的办公室管辖,但一个办公室可以管辖多张饭卡;

  • 多对多关系(m:n):两个表中的记录都可以与另一个表中的多个记录关联,例如“学生表”和“课程表”,一个学生可以选修多门课程,同时一门课程也可以被多个学生选修

4.设计原则与优化

  • 避免冗余:确保数据无重复存储(如学生信息不应在多个表中重复)。
  • 完整性约束:主键唯一性、外键参照完整性。
  • 规范化:至少满足第三范式(3NF),消除传递依赖。

5.标准画法

  • 实体 = 矩形
  • 属性 = 椭圆
  • 联系 = 菱形
  • 用直线连接,并在线上标注关系:
    • 1:1
    • 1:N
    • M:N

6.案例

        假定我们要为某社交平台建立一个数据库,存储如下信息:每个用户有用户编号、姓名、手机号;每个群有群编号、群名称;每个帖子有帖子编号、发帖时间、正文;每个群有唯一的用户作为群主,一个用户可以担任多个群的群主;每个群拥有多个用户,每个用户可以加入多个群;每个帖子只属于一个群,每个帖子有唯一的发布者,每个群可有多个帖子,每个用户可以发布多个帖子;

        有颜色的是主键,请根据以上描述,画出相应的E-R图

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐