大致介绍数据库中三种关系模型
一对多(1:N)
定义: 一个实体可以与另一个实体的多个实例相关联,而后者只能与前者的一个实例相关联。
例子: 学生和课程的关系。
- 学生(1):每个学生可以选修多门课程。
- 课程(N):每门课程可以被多个学生选修。
数据库表结构:
- 学生表(Students):包含学生ID、姓名等字段。
- 课程表(Courses):包含课程ID、课程名称等字段。
- 选课表(Enrollments):包含学生ID和课程ID,表示学生选修了哪些课程。
多对多(M:N)
定义: 两个实体之间存在多对多的关系,即一个实体的实例可以与另一个实体的多个实例相关联,反之亦然。
例子: 学生和课程的关系(与一对多的例子相同,但理解不同)。
- 学生(M):多个学生可以选修同一门课程。
- 课程(N):一门课程可以被多个学生选修。
数据库表结构:
- 学生表(Students):包含学生ID、姓名等字段。
- 课程表(Courses):包含课程ID、课程名称等字段。
- 选课表(Enrollments):包含学生ID和课程ID,作为关联表,表示学生和课程之间的多对多关系。
一对一(1:1)
定义: 一个实体的实例只能与另一个实体的一个实例相关联,反之亦然。
例子: 用户和用户详细信息的关系。
- 用户(1):每个用户有一个对应的详细信息记录。
- 详细信息(1):每个详细信息记录对应一个用户。
数据库表结构:
- 用户表(Users):包含用户ID、用户名等字段。
- 用户详细信息表(UserDetails):包含用户ID和用户的详细信息,如地址、电话等。
一对多
外键约束:是一个表中的字段(或字段组合)与另一个表中的主键(或唯一键)之间的关系。它确保了在外键字段中输入的数据在所关联的主表中是存在的,从而防止无效或孤立的数据记录。
外键语法
创建表时指定外键:
create table 表名 ( 字段名 数据类型, ... [constraint] 外键名 foreign key (外键字段名) references 主表(字段名) );
在表创建后添加外键:
alter table 表名 add constraint 外键名 foreign key (外键字段名) references 主表(字段名);
外键约束
物理外键
- 概念:使用 foreign key 定义外键关联另外一张表。
- 缺点:影响增、删、改的效率(需要检查外键关系)。仅用于单节点数据库,不适用与分布式、集群场景。容易引发数据库的死锁问题,消耗性能。(就是如果子表里没有任何一个对象的物理外键关联父表里的某一个对象,那么父表中才可以删除那个对象)
逻辑外键(推荐)
- 概念:在业务层逻辑中,解决外键关联。
- 通过逻辑外键,就可以很方便的解决上述问题。
一对一
实现一对一:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
多对多
相关案例
关系分析
分析菜品、套餐和相关分类之间的关系,关键数据库的关系模型,再看要额外建表吗。