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

<MySQL> 如何合理的设计数据库中的表?数据表设计的三种关系

目录

一、表的设计

二、一对一关系

三、一对多关系

四、多对多关系


一、表的设计

        数据库设计就是根据需要创建出符合需求的表。

        首先根据需求找到体系中的关键实体对象,通常每个实体对象都会有一个表,表中包含了这个实体的相关属性。

        再理清楚实体对象间的关系,不同的关系有不同的设计表的方式。

表的三种关系有:

关系说明
一对一的关系表1中一行数据和表2的一行数据一一对应。
一对多的关系表1中一行数据可以对应表2的多行数据。
多对多的关系表1中一行数据可以对应表2的多行数据,表二的一行数据同样可以对应表1中的多行数据。

二、一对一关系

图示:

示例:

语句create table register(id int primary key,date datetime);
说明创建表格register,以id作为主键。
语句

create table student(

        stu_id int primary key,name varchar(32),reg_id int unique,

        foreign key(reg_id) references register(id)

        );

说明

创建表格student,以stu_id作为主键,reg_id是唯一键,

以reg_id作为外键,与表格register中的id一一对应

总结:根据上述示例可以发现,一对一关系下,外键和外键关联的其他键通常是主键或唯一键。

三、一对多关系

图示:

示例:

语句

create table class(num int primary key,name varchar(32));

说明创建表格class,以num作为主键。
语句

create table student(

        stu_id int primary key,name varchar(32),class_num int,

        foreign key(class_num) references class(num)

        );

说明创建表格student,以stu_id作为主键,以class_num作为外键,与表格class中的num对应
总结:根据上述示例可以发现,一对多关系下,外键并不是唯一键,而外键关联的其他键则是主键或唯一键。这代表外键的值可以重复,但是其取值范围只能被限定在外键关联键已有的值中。

四、多对多关系

图示:

示例:

语句

create table course(id int primary key,name varchar(32));

说明创建表格course,以id作为主键。
语句

create table student(id int primary key,name varchar(32));

说明创建表格student,以id作为主键。
语句

create table cou_stu(

        cou_id int,stu_id int

        foreign key(cou_id) references course(id)

        foreign key(stu_id) references student(id)

        );

说明

创建表格cou_stu,

以cou_id作为外键,与表格course中的id对应,

以stu_id作为外键,与表格student中的id对应。

总结:

根据上述示例可以发现,多对多关系下,需要创建一张关联表来记录数据。

关联表中的作为外键的字段并非唯一键,而外键关联的其他键则是主键或唯一键。

这与一对多关系的设计类似,外键的值可以重复,但是其取值范围只能被限定在外键关联键已有的值中。

不同的是,多对多关系的表设计中,外键关联语句存在多条。


相关文章:

  • ubuntu搭建phpmyadmin+wordpress
  • HTTP客户端警告:Going to buffer response body of large or unknown size
  • qml渲染引擎介绍
  • ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作
  • golang指针学习
  • 完全平方数(模版)
  • Codeforces Round 745 (Div. 2)(C:前缀和+滑动窗口,E:位运算加分块)
  • 智能座舱架构与芯片- (13) 软件篇 下
  • 函数与数组
  • 音视频同步笔记 - 以音频时间为基
  • redis运维(十九)redis 的扩展应用 lua(一)
  • 如何下载OpenJDK及其源码
  • PHP 语法||PHP 变量
  • 睡前随笔记录
  • 含分布式电源的配电网可靠性评估matlab程序
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • canvas 绘制双线技巧
  • docker容器内的网络抓包
  • gf框架之分页模块(五) - 自定义分页
  • Git 使用集
  • Linux各目录及每个目录的详细介绍
  • orm2 中文文档 3.1 模型属性
  • Promise面试题2实现异步串行执行
  • Redis 中的布隆过滤器
  • Swoft 源码剖析 - 代码自动更新机制
  • 测试开发系类之接口自动化测试
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 服务器从安装到部署全过程(二)
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 排序算法学习笔记
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 试着探索高并发下的系统架构面貌
  • 新手搭建网站的主要流程
  • scrapy中间件源码分析及常用中间件大全
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # 飞书APP集成平台-数字化落地
  • #define与typedef区别
  • #include<初见C语言之指针(5)>
  • (C#)获取字符编码的类
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (循环依赖问题)学习spring的第九天
  • (转载)深入super,看Python如何解决钻石继承难题
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET命名规范和开发约定
  • @GlobalLock注解作用与原理解析
  • @TableLogic注解说明,以及对增删改查的影响
  • @WebServiceClient注解,wsdlLocation 可配置
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [Android]常见的数据传递方式
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [C++]指针与结构体