网站首页 > 精选文章 正文
在日常开发之中,数据库表经常会面临多对多的情况。对于多对多(M:N)关系的数据库设计,最佳实践是使用单独的关系表(也称为联结表或关联表),而不是直接使用外键。
为什么不用直接的外键
- 在数据库设计中外键主要用于建立一对多关系(1:N)
- 无法直接在两个表之间建立多对多关系的外键约束
多对多关系的标准实现方式
- 创建中间关系表:专门用于存储两个实体表之间的关系
- 关系表包含两个外键:分别指向相关联的两个表
- 可能包含额外属性:如果需要记录关系的额外信息(如创建时间、关系状态等)
示例
假设有学生(Student)和课程(Course)两个实体,一个学生可以选修多门课程,一门课程可以有多个学生选修:
-- 学生表
CREATE TABLE Student (
student_id INT PRIMARY KEY,
name VARCHAR(50),
-- 其他学生属性...
);
-- 课程表
CREATE TABLE Course (
course_id INT PRIMARY KEY,
name VARCHAR(50),
-- 其他课程属性...
);
-- 关系表
CREATE TABLE Student_Course (
student_id INT,
course_id INT,
enroll_date DATE, -- 可选: 关系的额外属性
grade DECIMAL(4,2), -- 可选: 关系的额外属性
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
优点
- 清晰表达多对多关系
- 可以添加关系特有的属性
- 符合数据库规范化原则
- 查询和维护都很方便
猜你喜欢
- 2025-07-24 数据库设计规范——3. SQL语句(sql数据库程序设计)
- 2025-07-24 数据库事务以及事务的四个特性(数据库中的事务)
- 2025-07-24 一文快速掌握MongoDB(mongodb 入门)
- 2025-07-24 为啥不推荐使用外键?(为什么不能添加外键约束)
- 2025-07-24 阿里云代理商:关系型数据库与NoSQL数据库的区别与选择
- 2025-07-24 Java面试题:数据库优化策略有哪些?
- 2025-07-24 【推荐】一款实用且跨平台的数据库管理神器,支持Web浏览器
- 2025-07-24 数据库系统原理:数据插入(数据库插数据语句)
- 2025-07-24 GBASE南大通用示例,使用 INDEX DISABLED 创建外键约束
- 2025-07-24 第四篇 数据库MySQL(mysql数据库sid)
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)