当前位置: 首页 > news >正文

整站优化工具wordpress joonla安全

整站优化工具,wordpress joonla安全,网站查询功能 技术支持 中企动力,wordpress ajax 提交评论数据库表设计:一对一、一对多、多对多 在关系型数据库中,表与表之间的关系常见三种:一对一、一对多、多对多。1. 一对一(One-to-One) 概念 一条记录对应另一张表的唯一一条记录,常用于把“主表”和“扩展信…

数据库表设计:一对一、一对多、多对多

在关系型数据库中,表与表之间的关系常见三种:一对一、一对多、多对多


1. 一对一(One-to-One)

概念

一条记录对应另一张表的唯一一条记录,常用于把“主表”和“扩展信息表”拆分存储。

示例:用户信息表 + 用户身份证表

-- 用户表
CREATE TABLE tb_user (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',name VARCHAR(10) NOT NULL COMMENT '姓名',gender TINYINT UNSIGNED NOT NULL COMMENT '性别, 1 男  2 女',phone CHAR(11) COMMENT '手机号',degree VARCHAR(10) COMMENT '学历'
) COMMENT '用户信息表';-- 用户身份证表
CREATE TABLE tb_user_card (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',nationality VARCHAR(10) NOT NULL COMMENT '民族',birthday DATE NOT NULL COMMENT '生日',idcard CHAR(18) NOT NULL COMMENT '身份证号',issued VARCHAR(20) NOT NULL COMMENT '签发机关',expire_begin DATE NOT NULL COMMENT '有效期限-开始',expire_end DATE COMMENT '有效期限-结束',user_id INT UNSIGNED NOT NULL UNIQUE COMMENT '用户ID',CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES tb_user(id)
) COMMENT '用户身份证表';

在这里插入图片描述

设计要点:

  • tb_user 存储基本信息,tb_user_card 存储扩展信息。
  • tb_user_card.user_id 设置 UNIQUE 保证一对一关系。
  • 外键 FOREIGN KEY 保证数据一致性。

2. 一对多(One-to-Many)

概念

一张表的一条记录,对应另一张表的多条记录,最常见的关系(父子关系)。

示例:部门表 + 员工表

-- 部门表
CREATE TABLE tb_dept (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '部门ID',name VARCHAR(10) NOT NULL UNIQUE COMMENT '部门名称',create_time DATETIME COMMENT '创建时间',update_time TIMESTAMP COMMENT '更新时间'
) COMMENT '部门表';-- 员工表
CREATE TABLE tb_emp (id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工id',username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',name VARCHAR(10) NOT NULL COMMENT '姓名',gender TINYINT COMMENT '性别,1男 | 2女',dept_id INT UNSIGNED COMMENT '部门ID',entrydate DATE COMMENT '入职时间',CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES tb_dept(id)ON UPDATE CASCADEON DELETE SET NULL
) COMMENT '员工表';

在这里插入图片描述

设计要点:

  • tb_dept.id 是主表主键,tb_emp.dept_id 是外键。
  • 一个部门可以对应多名员工。
  • ON DELETE SET NULL 避免删除部门时导致员工记录丢失。

3. 多对多(Many-to-Many)

概念

一张表的一条记录可以对应另一张表的多条记录,反之亦然,需通过中间表实现。

示例:学生表 + 课程表 + 中间表

非常好的问题!
答案是:可以同时存在主键 id 和联合唯一索引,但不能同时存在两个主键。
我帮你详细拆解一下,让你彻底理解。


在多对多中间表中,有两种常见设计方式:


方案 1:联合主键(推荐,最简洁)

CREATE TABLE tb_student_course (student_id INT NOT NULL,course_id INT NOT NULL,PRIMARY KEY (student_id, course_id),  -- 联合主键CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES tb_student(id),CONSTRAINT fk_course FOREIGN KEY (course_id) REFERENCES tb_course(id)
);

✅ 优点:

  • 主键天然保证 student_id + course_id 唯一。
  • 不需要额外字段,节省空间。
  • 查询性能好,直接走联合主键索引。

❌ 缺点:

  • 如果业务需要给这条“关系”单独添加扩展字段(比如选课时间、选课状态),插入、更新需要带上两个字段作为条件,不如单独 id 简洁。

方案 2:自增 id + 联合唯一索引(也常用)

CREATE TABLE tb_student_course (id INT PRIMARY KEY AUTO_INCREMENT,     -- 自增主键student_id INT NOT NULL,course_id INT NOT NULL,UNIQUE KEY uq_student_course (student_id, course_id), -- 联合唯一索引CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES tb_student(id),CONSTRAINT fk_course FOREIGN KEY (course_id) REFERENCES tb_course(id)
);

✅ 优点:

  • id 作为单列主键,方便引用(比如其他表还要引用这条记录)。
  • 插入更新时可以用 id 操作,而不是带两个字段。
  • 适合中间表需要扩展更多业务字段(选课时间、成绩、状态等)。

❌ 缺点:

  • 多一个冗余字段,占用一点存储空间。
  • 需要额外创建联合唯一索引,才能防止重复数据。

能不能两个主键同时存在?

不能。
MySQL 规定一张表只能有一个主键,即使是联合主键,也是一个主键,只是由多个列组成。所以不能同时有:

id INT AUTO_INCREMENT PRIMARY KEY,  -- 单列主键
PRIMARY KEY (student_id, course_id) -- 联合主键

这样会报错:“Multiple primary key defined”。


推荐做法

场景推荐方案
纯粹的关联关系表,不需要额外字段方案 1:联合主键
需要扩展字段(选课时间、成绩、状态)或需要单独引用此记录方案 2:自增 id + 联合唯一索引

-- 学生表
CREATE TABLE tb_student (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',name VARCHAR(10) COMMENT '姓名',no VARCHAR(10) COMMENT '学号'
) COMMENT '学生表';-- 课程表
CREATE TABLE tb_course (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',name VARCHAR(10) COMMENT '课程名称'
) COMMENT '课程表';-- 学生课程中间表
CREATE TABLE tb_student_course (student_id INT NOT NULL COMMENT '学生ID',course_id INT NOT NULL COMMENT '课程ID',PRIMARY KEY (student_id, course_id), -- 联合主键,防止重复选课CONSTRAINT fk_courseid FOREIGN KEY (course_id) REFERENCES tb_course(id)ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT fk_studentid FOREIGN KEY (student_id) REFERENCES tb_student(id)ON DELETE CASCADE ON UPDATE CASCADE
) COMMENT '学生课程中间表';

在这里插入图片描述

设计要点:

  • 中间表 tb_student_course 存两张主表的主键。
  • 可以加联合唯一索引 (student_id, course_id) 避免重复选课。
  • 通过 JOIN 查询多对多关系。

4. 三种关系对比

关系类型特点表设计关键点
一对一一条记录对应另一张表唯一一条记录外键 + UNIQUE
一对多一条记录对应另一张表多条记录外键 (多端表保存外键)
多对多两张表多对多互相关联需要中间表 + 两个外键

✅总结

  • 一对一 → 外键 + UNIQUE
  • 一对多 → 外键放在“多”的一端
  • 多对多 → 用中间表拆成两个一对多

http://www.dtcms.com/a/537280.html

相关文章:

  • 在Linux下循环创建N个子进程的实现与解析
  • Spring AI Alibaba 基于JWT的鉴权登录系统实现详解
  • 软件测试(五)--自动化测试Selenium(一)
  • 网站项目开发网站菜单导航制作教程
  • 兰州最好的网站建设公司青岛网站优化排名
  • 某汽车公司4S店携手Acrel-5000建筑能耗管理系统,实现连锁门店能源精细化管理新突破
  • LeetCode 刷题【135. 分发糖果】
  • 专业做网站建设的网站内页产品 首页推荐
  • TCP 流通信中的 EOFException 与 JSON 半包问题解析
  • Garnet技术深度解析:微软研究院出品的高性能缓存存储引擎
  • 如何制作论坛网站网页制作软件是哪个
  • 《从点击到响应:HTTP 请求是如何传出去的》
  • 科技+文化:从“参观游览”到“沉浸共生”的文旅产业革命
  • 做条形图的网站河南郑州网站建设
  • 青少儿机器人技术学什么?
  • 基本魔法语言数组 (一) (C语言)
  • php源码网站修改保定建设厅网站
  • 网站建设访问对象网站开发毕设的需求分析
  • 【实战】自然语言处理--长文本分类(2)BERTSplitLSTM算法
  • Markdown模板20251027
  • Linux命令解释:cp -r --parents用法
  • 关于企业的网站天津做网站找谁
  • 0138. 随机链表的复制
  • 长春网站建设公司seo是什么意思教程
  • 【vllm】源码解读:vLLM 中 Data Parallelism DP=8 核心原理详解
  • 对信号的理解
  • 【系统分析师】高分论文:论软件的安全性设计(某校通系统)
  • 硬盘专业名词:总线、协议、接口详细解析
  • Agent Skills应用解析:构建可扩展、高效率AI探员
  • 【车载测试常见问题】CAN一致性测试包含哪些内容?