数据库多表设计:深入理解一对多、一对一、多对多关系 【后端 12】

news2024/11/25 3:32:18

数据库多表设计:深入理解一对多、一对一、多对多关系

请添加图片描述

在数据库设计中,表之间的关系决定了如何组织和存储数据。常见的表关系包括一对多一对一多对多。在不同的业务场景下,我们会选择不同的关系模式进行数据库设计。本文将通过具体案例介绍如何设计这些表关系,并探讨其在业务中的应用场景。


1. 一对多关系设计

1.1 概念

一对多(One-to-Many)关系是最常见的数据库设计模式。它表示一个表中的某条记录可以与另一个表中的多条记录相关联。例如,一个用户可以有多个订单,但每个订单只能对应一个用户

1.2 设计案例

假设我们有一个电商系统,里面有用户(User)和订单(Order)两个实体。用户与订单之间是一对多关系,即一个用户可以有多个订单。

-- 用户表
CREATE TABLE User (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

-- 订单表
CREATE TABLE Order (
    order_id INT PRIMARY KEY,
    order_date DATE,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES User(user_id)
);

在这里,user_id作为外键放在订单表中,表示一个用户可以有多个订单。这种设计体现了一对多的关联关系。

1.3 应用场景
  • 电商系统中的用户和订单
  • 公司系统中的部门与员工

2. 一对一关系设计

2.1 概念

一对一(One-to-One)关系表示两个表中的记录相互一一对应。每个记录只能在两个表中各出现一次。通常这种设计用来把一些可选或延伸信息从主表拆分出来。

2.2 设计案例

以用户和其详细信息为例。在用户表中可能不需要存储所有的详细信息,我们可以通过一个用户详情表来保存补充信息。

-- 用户表
CREATE TABLE User (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

-- 用户详情表
CREATE TABLE UserProfile (
    profile_id INT PRIMARY KEY,
    address VARCHAR(200),
    phone_number VARCHAR(15),
    user_id INT UNIQUE,
    FOREIGN KEY (user_id) REFERENCES User(user_id)
);

在这个设计中,UserProfile表中的user_id字段设置了UNIQUE,确保每个用户只能对应一个用户详情,从而实现了一对一的关系。

2.3 应用场景
  • 用户和用户详细信息
  • 员工和员工的合同信息

3. 多对多关系设计

3.1 概念

多对多(Many-to-Many)关系表示两个表中的记录可以互相关联多个。例如,一个学生可以选多门课程,而每门课程可以有多个学生。

为了在数据库中表示多对多关系,通常需要一个中间表来存储这种关联。

3.2 设计案例

假设我们有一个课程管理系统,其中有学生(Student)和课程(Course)两个实体。学生与课程之间是多对多关系,即一个学生可以选修多门课程,一门课程可以被多个学生选修。

-- 学生表
CREATE TABLE Student (
    student_id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 课程表
CREATE TABLE Course (
    course_id INT PRIMARY KEY,
    course_name VARCHAR(100)
);

-- 学生课程中间表
CREATE TABLE StudentCourse (
    student_id INT,
    course_id INT,
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES Student(student_id),
    FOREIGN KEY (course_id) REFERENCES Course(course_id)
);

在这个例子中,StudentCourse表充当中间表,存储学生与课程的关联关系。这个表的主键是复合主键,由student_idcourse_id共同组成,表示学生与课程的多对多关系。

3.3 应用场景
  • 学生和课程的选课关系
  • 用户和角色的权限管理

4. 总结

在数据库设计中,不同的表关系类型对应着不同的业务需求:

  • 一对多:适用于一方可以拥有多条关联记录的场景,例如用户和订单。
  • 一对一:适用于一方记录需要精确匹配另一方记录的场景,例如用户和用户详细信息。
  • 多对多:适用于两方可以有多个关联记录的复杂关系,例如学生和课程。

合理的表设计可以提高数据查询的效率,减少数据冗余,并使得业务逻辑更为清晰。设计过程中,务必根据实际业务需求选择合适的表关系,确保系统的可扩展性与维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux Qt QkeyEvent及驱动键盘按键捕获

基于正点原子 QT中有专门的类处理键盘事件的类QKeyEvent 1.include “QKeyEvent” 查看它的说明中的描述 也就是说接受按键事件在keyPressEvent和keyReleaseEvent这两个函数,继续查看 重构这个函数 查看输入的QKeyEvent类,发现有一个方法key返回哪一个按…

MinerU pdf文档解析markdown格式、内容提取

参考: https://github.com/opendatalab/MinerU/blob/master/README_zh-CN.md demo在线网址: https://opendatalab.com/OpenSourceTools/Extractor/PDF/detail

Robot Operating System——创建动态链接文件项目的步骤

大纲 初始化环境创建Package代码添加依赖(package.xml)修改编译描述find_package寻找依赖库指定代码路径和编译类型(动态库)设置头文件路径链接依赖的库 编译测试参考资料 在 《Robot Operating System——创建可执行文件项目的步…

大数据-93 Spark 集群 Spark SQL 概述 基本概念 SparkSQL对比 架构 抽象

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

VMware虚拟机nat无法联通主机

VMware在nat模式下主机无法ping通虚拟机 原因: 虚拟机和对应的网卡不在一个网段 虚拟机开启了防火墙 解决方法: 首先判断虚拟机的网络ip是否和网卡在一个网段上 判断虚拟机使用的网卡 nat模式在VMware虚拟机中一般只有一个对应的网卡 如图笔者的nat网卡为VM…

基于机器学习的二手房房价数据分析与价格预测模型

有需要本项目的可以私信博主,提供远程部署讲解 本研究聚焦重庆二手房市场,通过创新的数据采集和分析方法,深入探讨影响房价的关键因素,并开发了预测模型。 我们首先利用Python编写的爬虫程序,巧妙规避了链家网站的反…

ClickHouse实时探索与实践 京东云

1 前言 京喜达技术部在社区团购场景下采用JDQFlinkElasticsearch架构来打造实时数据报表。随着业务的发展 Elasticsearch开始暴露出一些弊端,不适合大批量的数据查询,高频次深度分页导出导致ES宕机、不能精确去重统计,多个字段聚合计算时性能…

初识Linux · 权限

目录 前言: 1 预备知识 2 权限 2.1 文件的基本权限 2.2 修改权限的第一种做法 2.3 修改权限的第二种做法 2.4 权限的对比 2.5 文件类型 前言: 继上文我们将常用的指令介绍的七七八八了,本文着重探索Linux文件中的权限部分&#xff0…

docker部署postgresSQL 并做持久化

先安装docker,安装docker 方法自行寻找方法 然后安装pgsql 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest运行容器 docker run -it --name postgres --privileged --restart always -e POSTGRES_PASSWORDZ6n8g4zJzC3mr…

手动与自动修复mfc140u.dll丢失的解决方法,mfc140u.dll在电脑中是什么样的存在

当您遇到“mfc140u.dll丢失”的错误时,通常意味着计算机上缺少Microsoft Foundation Class (MFC) 库的特定版本,该库是Visual Studio 2015的一部分。这种问题往往在启动某些应用程序或游戏时出现,并显示如“无法启动该程序,因为计…

可变参数模板(C++11)

这篇文章讲解的是C11的特性之一——可变参数模板,适合有一定基础的同学学习,如果是刚入门的同学可以看我过往的文章:C基础入门 可变参数模板(Variadic Templates)是C的一种高级特性,它允许你编写接受任意数…

8.20T3 无损加密(线性代数转LGV+状压dp+高维前缀和)

http://cplusoj.com/d/senior/p/NODSX2301C 对于式子: 这个神秘的线性代数形式比较难处理,但我们可以考虑其组合意义。行列式现存的可用组合意义之一就是LGV(矩阵式不太可用) 先把原先的矩阵转化为一个有向图。现在我们要构造一…

笔记本电脑无线网卡突然没有了

目录 笔记本电脑无线网卡突然没有了最优解决方案 笔记本电脑无线网卡突然没有了 记录一次笔记本无线网卡突然没有了的解决方案 显示黄色感叹号,试了几个安装驱动的软件都不行 最优解决方案 找到网卡的厂商官网,官网上下载驱动 比如我的无线网卡是Int…

【Hot100】LeetCode—146. LRU 缓存

目录 1-思路1-1 LRU知识点1-2 实现思路LRU的子数据结构① 双向链表 DLinkedNode 结点定义② 其他字段 LRU实现的方法① 初始化——LRUCache中初始化② public int get(int key) 取元素方法③ public void put(int key, int value) 存元素方法 2-实现⭐146. LRU 缓存——题解思路…

rufus制作ubantu的U盘安装介质时,rufus界面上的分区类型选什么?

rufus制作ubantu的U盘安装介质时,rufus软件界面上的分区类型选什么(如下图)? 在使用Rufus制作Ubuntu的U盘安装介质时,分区类型的选择取决于我们的计算机的引导方式。 以下是具体的选择建议: 1、查看计算机的引导方式…

JAVA设计模式之【单例模式】

1 类图 2 饿汉式单例 例如:静态块、静态成员 2.1 概念 类加载的时候就立即初始化,并且创建单例对象 2.2 优点 没有加任何的锁、执行效率比较高 2.3 缺点 类加载的时候就初始化,不管用与不用都占着空间,浪费了内存。 3 懒汉…

Java之迭代器的使用

Java之迭代器的使用 摘要基础知识List迭代器Map迭代器 摘要 本博客主要讲解容器的迭代器的使用,包括List、Set和Map等容器 基础知识 这是类的继承关系图 迭代器的原理(一开始迭代器并不指向任何有效元素): List迭代器 public class TestIterator …

VMware vSphere Client无法访问和连接ESXi虚拟主机解决思路

文章目录 前言1. 问题现象2. 问题原因3. 解决方法4. 参考文章 前言 注意 : 可以先看看参考文章那里,在回过来看 1 、 2 、3 1. 问题现象 版本:VMware vCenter Server 5.5.0 build-2442329 问题描述:用VMware vSphere Client 登录ESXI主机出…

【Linux —— 线程互斥】

Linux —— 线程互斥 1. 临界资源与临界区2. 互斥的定义3. 原子性4. 互斥量(Mutex)5. 互斥的实现示例 1. 临界资源与临界区 临界资源: 指的是多个线程或进程共享的资源,例如全局变量、文件、数据库等。由于这些资源的共享,可能会导致数据不一致或程序崩…

git commit 时发生:fatal: cannot lock HEAD ref

.git目录探析_.git文件在哪-CSDN博客https://blog.csdn.net/luofeng457/article/details/117577275 tree .git .git ├── branches ├── COMMIT_EDITMSG ├── config ├── description ├── FETCH_HEAD ├── HEAD ├── hooks │ ├── applypatch-msg.sample…