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

这篇具有很好参考价值的文章主要介绍了MySQL表设计思路(一对多、多对多...)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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


一、MySQL中的数据类型

字符串类型

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

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

日期和时间类型

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

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

数值类型

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

二、一对一的关系设计

一张表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图:

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

设计思路:

  • 在“多”关系的表中去维护一个字段,这个字段是“一”关系的主键。如员工与部门,就在员工表中加部门id字段
    MySQL表设计思路(一对多、多对多...)
  • 维护一个关联字段后,加不加外键约束看你的实际业务需求

注意点:

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

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

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

三、多对多的关系设计

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

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

设计思路:

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

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

注意点:

  • 添加数据时,先添加父表记录(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自增

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

  • 看UI时,考虑这个字段我要不要存,这个字段我必须记下来?还是可以算,那就不记了。空间上冗余来换取时间,还是代码中计算,牺牲时间换空间,自行衡量

  • 添加以下必需字段,如update_time、create_time
    MySQL表设计思路(一对多、多对多...)

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

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

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

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

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

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

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

  • 加注释comment,特别是枚举类型
    MySQL表设计思路(一对多、多对多...)

  • 要提高数据库的运行效率,考虑从三个级别下手:数据库系统级优化、数据库设计级优化、程序实现级优化文章来源地址https://www.toymoban.com/news/detail-465884.html

到了这里,关于MySQL表设计思路(一对多、多对多...)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理

    目录 一.关联关系配置的好处  二. 导入数据库表:  三.    一对多关系:--    一个订单对应多个订单项        四.一对一关系:---一个订单项对应一个订单 五.多对多关系(两个一对多)          MyBatis是一个Java持久化框架,可以 通过XML或注解的方式 将对象与数据库

    2024年02月11日
    浏览(61)
  • 杨中科 .NETCORE EFCORE第七部分 一对一,多对多

    1、builder.HasOne(o =o.Delivery).WithOne(d=d.Order).HasForeignKey(d=dOrderId); 2、测试插入和获取数据 示例 新建 Order 新建 Delivery DeliveryConfig OrderConfig 执行 迁移命令 查看数据库 测试数据插入 运行查看数据 1、多对多:老师一学生 2、EF Core 5.0开始,才正式支持多对多 3、需要中间表,举例数据

    2024年01月17日
    浏览(42)
  • Django基础入门⑪:DjangoDjango数据表关联(一对一,一对多,多对多关系)

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 Django数据表关

    2024年02月12日
    浏览(58)
  • websocket 局域网 webrtc 一对一 多对多 视频通话 的示例

    基本介绍 WebRTC(Web Real-Time Communications)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第

    2024年04月28日
    浏览(46)
  • MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询

    MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 com.github.dreamyoung mprelation 0.0.3.2-RELEASE 注解工具使用优缺点: 优点: 使用简单,通过在实体类上添加@OneToOne / @OneToMany / @ManyToOne / @ManyToM

    2024年01月20日
    浏览(49)
  • 在Django的数据库操作模型中,怎样获取一对多或多对多关系中的所有“多”?(使用特殊属性:逆向关系管理器)

    当一个模型通过外键或多对多字段与另一个模型建立关联时,Django会自动为该模型生成逆向关系管理器。这个逆向关系管理器的名称是通过在模型类名后面添加 _set 来生成的。在逆向关系管理器上,你可以使用多种查询方法来访问相关对象。 让我们以一个示例来说明。假设你

    2024年02月16日
    浏览(48)
  • Mybatis多对多查询案例!

    在MyBatis中执行多对多查询需要使用两个主要表和一个连接表(通常称为关联表)来演示。在这个示例中,我们将使用一个示例数据库模型,其中有三个表:`students`、`courses` 和 `student_courses`,它们之间建立了多对多关系。`students` 表存储学生信息,`courses` 表存储课程信息,

    2024年02月11日
    浏览(30)
  • JPA实现多对多关系

    本文已收录于专栏 《Java》   多对多关系是指两个实体之间存在多对多的关联关系。在数据库中,多对多关系无法直接表示,需要通过中间表来实现。   举个例子,假设有两个实体类:学生(Student)和课程(Course)。一个学生可以选择多门课程,而一门课程也可以被多

    2024年02月17日
    浏览(38)
  • EFCore-13 多对多关系配置

    学生与老师的关系,是一个常见的多对多的关系模型,一个老师有多个学生,一个学生也可能有多个老师。关系模型图如下所示: 学生1的老师为老师1、老师2 学生2的老师为老师2、老师3 学生3的老师为老师1、老师2、老师3 下面用程序实现这样的关系模型。 新建一个控制台应

    2024年02月12日
    浏览(41)
  • Kurento多对多webrtc会议搭建测试

    环境ubuntu18.04 KMS版本6.13.0 多对多通信demo7.0.0 KMS运行起来后,通过运行它的一个个demo,来实现不同的功能,它的demo很多如下: https://github.com/Kurento 里面有一对一,多对多,还有一些特效的demo。这里运行的是多对多通话的demo。 它的KMS可以通过apt方式安装,然后拉下来每个d

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包