MySQL表设计思路(一对多、多对多...)

要开始单独负责需求了,捋一捋表设计的思路。

在这里插入图片描述

文章目录

  • 一、MySQL中的数据类型
  • 二、一对一的关系设计
  • 二、一对多的关系设计
  • 三、多对多的关系设计
  • 四、经验总结


一、MySQL中的数据类型

字符串类型

在这里插入图片描述

  • varchar:即variable char ,可边长度的字符串,会根据实际数据的长度动态分配空间,以节省空间,如varchar(10)存jack,则只给4字节
  • char:定长字符串,最大255字符。不论实际数据长度都以定长空间存储,使用不当容易浪费空间
  • char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数。一个汉字字符存储要两字节,一个英文字符存储一个字节
  • varchar要动态分配空间,故效率低于char。如果存性别等定长的,用char好,存人名、则varchar

日期和时间类型

在这里插入图片描述

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR

数值类型

在这里插入图片描述

二、一对一的关系设计

一张表A中的一条记录只能对应另一张表B中的一条记录,另一张表B中的一条记录也只能对应一张表A中的一条记录。如:学生表和学生卡表

设计思路:

  • 把两个实体存在一张表中
  • 分两张表且共享主键
学生表student
id     name
1001    张三
1002    张四

学生卡表card
id      name
1001    card1
1002    card2

此时查询张三信息:
SELECT 
	*
FROM 
	card c
WHERE 
	id='1001'
  • 分两张表且加唯一外键。(加外键且这个外键要求不重复)
学生表student
id     name
1001    张三
1002    张四

学生卡表card
id      name	stuent_id(设计表时给该字段添加唯一性约束)
111    card1	 1001
222    card2	 1002


此时查询张三的信息--

SELECT 
	* 
FROM 
	card c 
JOIN 
	student s 
ON 
	c.student_id=s.id 
WHERE 
	s.name='张三'

注意点:

  • 字段较多时,做好静态表和动态表的分离,静态表即存储着一些固定不变的资源,比如城市/地区名/国家。动态表:一些频繁修改的表,如年龄、体重

二、一对多的关系设计

一对多的关系很常见,如:一个部门对应多个员工、一个班级对应多个学生。E-R图:

在这里插入图片描述

设计思路:

  • 在“多”关系的表中去维护一个字段,这个字段是“一”关系的主键。如员工与部门,就在员工表中加部门id字段
    在这里插入图片描述
  • 维护一个关联字段后,加不加外键约束看你的实际业务需求

注意点:

  • 加外键约束,会保证数据业务上的一致性

  • 不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)

  • 对于海量数据的场景,insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,性能就会大打折扣

三、多对多的关系设计

多对多的关系如:大学生与课程,一个大学生有多门课程,每个课程下有多个大学生,此时在哪个表中添加外键字段都不行,E-R图:

在这里插入图片描述

设计思路:

  • 建立关系表
  • 两个实体表和关系表之间,分别就成了一对多的关系

在这里插入图片描述

注意点:

  • 添加数据时,先添加父表记录(student,course),再添加子表(student_course_relation)记录
  • 删除数据时,先删除子表记录(student_course_relation),再删除父表记录(student,course)
  • 查询时,内连接查询(等值连接、非等值连接、自连接)还是外连接查询(左外连接、右外连接)看业务选
/查询所有姓张的学生的id、name和所选课程的name:

SELECT 
	s.id, s.name, c.name
FROM
	student s
JOIN 
	student_course_relation scr
ON 
	scr.student_id=s.id
JOIN 
	course c
ON 
	scr.course_id=c.id
WHERE
	s.name LIKE '张%'

四、经验总结

  • 一对多,两张表,多的表加外键.

  • 多对多,三张表,关系表加外键.

  • 命名规范,表名以t_或者tbl_开头,增加可读性,字段采用下划线命名,避免用保留字,如select、desc

  • 主键索引名为pk_字段名,唯一索引名为uk_字段名,普通索引名为idx_字段名

  • 数据类型选择时,金额类不能选择float、double,选decimal,防止精度丢失

  • 主键的设计最好设业务主键,最好是一串无意义且不重复的数字,可采用UUID或者Auto_increment自增

  • 数据库不要存储任何资源文件,比如照片/视频/网站等,可以用文件路径/外链用来代替

  • 添加以下必需字段,如update_time、create_time
    在这里插入图片描述

  • 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表

  • 维护一字段表示该行记录是否可用,可起名为isVaild,预制的含义为0为有效,1为无效,也即逻辑删除

  • 关于NULL和NOT NULL,NULL值的存储也需要空间,且可能导致索引失效,不影响业务的话建议NOT NULL default

  • 索引建立太多,会降低写的速度,建议单表索引不要超过5个

  • 除了MySQL中主键和unique字段自动添加索引,当数据量庞大,手动加索引时挑选字段的思路有:
    。 该字段经常出现在where后面,以条件的形式存在,即该字段总被扫描
    。该字段不会频繁DML,DML后,索引需要重新排序,而索引维护会降低系统性能

  • 数据库三范式,只是一个规范,有时候数据冗余不一定就不好,这叫空间换时间

  • 外键有好有坏,不加外键约束,在代码层校验业务逻辑也行

  • 加注释comment,特别是枚举类型
    在这里插入图片描述

  • 要提高数据库的运行效率,考虑从三个级别下手:数据库系统级优化、数据库设计级优化、程序实现级优化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat启动JSP项目,搞起来了

虽然有点复古,但是还是有很多小伙伴在使用的,小编来一篇保姆级教程 1、用idea打开jsp项目 2、添加tomcat配置 3、点击后会出现配置框,这里画框的地方都选上,版本选择1.8,其他的信息内容默认后,点击确认 4、点击…

FITC-PEG-Biotin,荧光素-聚乙二醇-生物素的相关检测

FITC-PEG-Biotin 荧光素聚乙二醇生物素 英文名称:Fluorescein (polyethylene glycol) Biotin 中文名称:荧光素聚乙二醇生物素 激光/发射波长:515nm~520 nm 分子量:2000、3400、5000其他分子量可制定 溶剂&#xff…

【C++】异常

文章目录C传统处理错误方式C异常概念异常使用1.异常的抛出和捕获2.异常的重新抛出异常安全异常规范自定义异常体系C标准库的异常体系异常的优缺点C传统处理错误方式 C语言传统的错误处理机制: 1. 终止程序,如assert,缺陷:用户难以…

nodejs+vue文旅门户信息网站 elementui旅游项目推荐系统 景点门票预订网站vscode

在社会快速发展的影响下,服务行业继续发展,随着旅游的人数不断增加,使哈尔滨旅游项目推荐平台的管理和运营比过去十年更加信息化,依照这一现实为基础,设计一个快捷而又方便的网上哈尔滨旅游项目推荐平台是一项十分重要…

day73【代码随想录】二刷链表

文章目录前言一、环形链表||(力扣142)二、寻找重复数(力扣287)三、缺失的第一个正数(力扣41)每日一题day73:等差子数组(力扣1630)前言 1、等差子数组 2、寻找重复数 3、…

ThreeJS-纹理(十)

关键代码: const textureLoader new THREE.TextureLoader(); //纹理加载器加载图片 const docColorLoader textureLoader.load(static/1.webp) // let color new THREE.Color(Math.random(), Math.random(), Math.random()); const cubeMaterial new THREE.Mesh…

法规标准-GB/T 39901标准解读(2021版)

GB/T 39901是做什么的? GB/T 39901全名为乘用车自动紧急制动系统(AEBS)性能要求及试验方法,其中主要对AEBS的功能要求、性能要求及测试要求进行介绍 一般要求 1.安装有自动紧急制动系统的车辆应安装符合GB 21670-2008要求的防抱制动系统 2.AEBS的电磁…

近世代数 笔记和题型连载 第七章(阿贝尔群和循环群)

文章目录基础概念1.阿贝尔群2.循环群3.有限循环群4.元素的阶5.无限循环群相关题型1.判断一个代数系统的代数结构2.判定一个群是否是循环群3.判定一个群是否是循环群4.循环群的生成元有关问题5.判定元素的阶6.判定元素的阶7.判定元素的阶8.求给定循环群的所有子群9.求给定循环群…

七. MySQL 其它优化相关

目录一. 数据库问题排查流程二. 表连接驱动表与被驱动表Nested Loop Join 与小表驱动大表JoinBuffer 连接缓冲区Index Nested-Loop Join 索引嵌套循环连接Batched Key Access join 批量的key访问连接Block Nested-Loop Join 缓存块嵌套循环连接三. 半连接in 与 existssemi-join…

Vue 04 - Vue模板语法

目录 介绍 Mustache 插值语法 Attribute指令语法 代码演示 运行效果 介绍 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解…

PCB模块化设计10——PCI-E高速PCB布局布线设计规范

目录PCB模块化设计10——PCI-E高速PCB布局布线设计规范1、PCI-E管脚定义2、PCI-E叠层和参考平面3、 PCB设计指南1、阻抗要求2、线宽线距3、长度匹配4、走线弯曲角度5、测试点、过孔、焊盘6、AC去耦电容放置方法7、金手指和连接器的注意事项8、其他的注意事项PCB模块化设计10——…

STM32学习笔记(一)基础知识

文章目录一、什么是单片机?二、STM系列单片机命名规则三、STM32F103C8T6单片机简介四、标准库与HAL库区别五、通用输入输出端口GPIO六、复位和时钟控制(RCC)七、时钟八、中断和事件九、定时器一、什么是单片机? 单片机和PC电脑相比…

SpringBoot的多环境配置详解(上)——文件配置项版

SpringBoot不同环境加载不同配置文件 - resource & profile 文章目录SpringBoot不同环境加载不同配置文件 - resource & profile1、 profile多配置文件2、 profile单配置文件3、maven的profiles策略4、spring.profiles.activeprofiles.active用法1、 profile多配置文件…

健身房训练计划—背部

杠铃屈腿硬拉(臀,大腿) 动作要领: 1,站距和肩等宽,脚尖微微外八,拉的时候把杆贴近小腿,身体成45度(头背腰成45度)。 2,发力的时候腿用力向上蹬&am…

IOC 相关内容

IOC 相关内容4,IOC相关内容4.1 bean基础配置4.1.1 bean基础配置(id与class)4.1.2 bean的name属性步骤1:配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序4.1.3 bean作用范围scope配置4.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现4.1.3.…

三个月从功能测试进阶到自动化测试,涨薪5k?你在想啥呢?

一、自动化测试要学多久能学会? 兄弟,老实说如果你现在上班,之前主要在做功能测试,或者编程基础比较弱的话,三个月够呛。 如果你是脱产学习,每天能保持6~8小时学习时间的话,可以。…

【综】A review of bicycle-sharing service planning problems

A review of bicycle-sharing service planning problems 共享单车服务规划问题综述 article{ZHOU2022608, title {Review of bike-sharing system studies using bibliometrics method}, journal {Journal of Traffic and Transportation Engineering (English Edition)}, v…

12.0 自定义SystemUI下拉状态栏和通知栏视图(十九)之悬浮通知布局

1.前言 在进行12.0的系统rom产品定制化开发中,在12.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删…

是面试官放水,还是企业实在是缺人?这都没挂,字节原来这么容易进...

“字节是大企业,是不是很难进去啊?”“在字节做软件测试,能得到很好的发展吗?一进去就有9.5K,其实也没有想的那么难”直到现在,心情都还是无比激动! 本人211非科班,之前在字节和腾讯…

基于springboot学生信息管理系统

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…