当前位置: 首页 > 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对应。

总结:

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

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

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

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


http://www.lryc.cn/news/236917.html

相关文章:

  • 基于操作系统讨论Java线程与进程、浅谈Go的线程与管程
  • CICD 持续集成与持续交付——jenkins
  • 【Zabbix】Zabbix Agent 2在Ubuntu/Debian系统上的安装
  • 浅谈无线测温产品在菲律宾某工厂配电项目的应用
  • 软件工程第十一周
  • 【从入门到起飞】JavaSE—带你了解Map,HashMap,TreeMap的使用方法
  • [Docker]六.Docker自动部署nodejs以及golang项目
  • FPC焊点剥离失效分析
  • Java爬虫框架下代理使用中的TCP连接池问题及解决方案
  • PostgreSQL 数据定义语言 DDL
  • 设计模式-行为型模式-策略模式
  • ResizeObserver观察元素宽度的变化
  • 斐波那契数列,剑指offer,力扣
  • Mac安装CocoaPods
  • APP专项测试方法和工具的使用(测试新手必看)
  • WordPress网站迁移实战经验
  • 3D全景视角,足不出户感知真实场景的魅力
  • C编译环境和预处理(非常详细,建议收藏)
  • LeetCode669. Trim a Binary Search Tree
  • YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023
  • 【数据结构(二)】稀疏 sparsearray 数组(1)
  • MySQL的执行器是怎么工作的
  • 【目标测距】雷达投影测距
  • uniapp、小程序canvas相关
  • [工业自动化-23]:西门子S7-15xxx编程 - 软件编程 - 西门子PLC人机界面交互HMI功能概述、硬件环境准备、软件环境准备
  • 在Ubuntu系统中安装VNC并结合内网穿透实现公网远程访问
  • java基础练习缺少项目?看这篇文章就够了(上)!
  • 鸿蒙为什么使用typescript 作为开发语言 而不是 flutter 或者 kotlin
  • Flutter NestedScrollView 、SliverAppBar全解析,悬浮菜单的应用
  • Mongodb 副本集名称重命名