mysql数据表设计经验汇总篇

mysql数据表设计经验汇总篇
一,命名,见名知意,命名规范,命名可读性高,尽量使用英文,采用驼峰命名。
1,表名:customer_id,order_date,product_name
2,字段名:customer_id,order_date,product_name
3, 索引名:idx_customer_id,idx_order_date

Tips

1) 表名,字段名必须使用小写字母,禁止使用数字开头,禁止使用拼音,并且一般不使用英文缩写。
2)主键索引名为 pk字段名,唯一索引名为 uk字段名;普通索引名则为idx_字段名
二, 选择合适的字段类型
设计表前,需要选择合适的字段类型,比如说:
1,根据数据类型选择字段类型:不同的数据类型应该使用不同的数据类型
1),整数型数据可以使用INT或者BIGINT类型
2),浮点型数据可以使用FLOAT或者DOUBLE类型
3),字符型数据可以使用VARCHAR或CHAR类型
2, 考虑数据长度。
1)如果某个字段数据长度不会超过10个字母,则可以使用CHAR(10)类型代替VARCHAR(50)类型,以节省空间。
2)如果存储的值太大,建议字段类型修改为text,同时抽出单独一张表,用主键与之对应。
3,注意精度和小数位数:
对于需要精确数值计算的字段(如货币和百分比),应该选择带有精度和小数位数的字段类型(如DECIMAL).
4,考虑数据完整性:字段类型也应该考虑到数据完整性
日期型数据应该使用DATE或DATETIME类型,以确保输入的日期格式正确。
三,主键设计要合理,MySQL的实现以及二叉树
主键的设计在数据库中非常重要,它用于唯一标识表中的每一行数据,并且在数据操作和查询中起到关键作用。通常主键的设计,不要与业务相关联,因为业务是会发生变化的,应当使用自增的id,并且保持主键的连续性。比如说可以使用优化的雪花ID(分布式系统)[uuid不推荐使用]。
四,选择合适的字段长度
首先问大家一个问题,数据库字段长度表示字符长度还是字节长度?
在mysql中,VARCHAR和CHAR类型表示字符长度,而其他类型表示的长度都是表示字节长度。
CHAR(10)表示字符长度是10
bigint(4)表示显示长度是4个字节,但因为bigint实际长度是8个字节,所以bigint(4)的实际长度就是8个字节。
所以在设计表时需要考虑一个字段的长度,比如一个用户名字段(它的长度5-20个字符),你觉得应该设置多长呢?可以考虑设置为VARCHAR(32),需要注意用户名字段长度一般设置为2的n次方,注意java中Hash Map的长度(2的n次方)
五,优先考虑逻辑删除,而不是物理删除
什么是物理删除?什么是逻辑删除?
1)物理删除:把数据以硬盘中删除,可释放存储空间。
2)逻辑删除:给数据添加一个字段,比如is_deleted,以标识该数据已经逻辑删除。
为什么推荐使用逻辑删除,不推荐物理删除呢?
1)数据恢复困难
2)物理删除会导致索引树重构。
六,每个表需要添加通用字段
1)id: 主键,一个表必须得有主键,必须
2)create_time: 创建时间
3)creater: 创建人
4)update_time: 修改时间,必须,更新记录时,需要更新它
5)update_by: 修改人,非必须
6)remark: 数据记录备注,非必须
七,一张表的字段不宜过多
建表的时候一张表的字段不要太多,尽量不超过20个,超出的话优先考虑撤分,也就是通常的查询表,详情表
1)查询效率:当表中保持的数据数量很大时,查询操作需要检查的数据也会随之增加;如果表的字段数过多,查询操作就需要读取更多的数据,这会导致查询效率变慢。
2)存储空间:表的字段数越多,每一行数据占用的存储空间也就越大。对于大型数据库来说,这个可能会导致磁盘空间的浪费。
3)数据库设计复杂性:当表的字段数过多时,数据库的设计和维护支持变得更加复杂,这可能涉及到索引和关联表的设计,以确保数据的完整性和一致性,
八,定义字段尽可能NOT NULL
如果没有特殊的理由,一般都建议将字段定义为NOT NULL:
1) 首先,NOT NULL 可以防止出现空指针问题
2)其次,NULL值存储也需要额外的空间的,它也会导致比较运算更为复杂,使用优化器,难以优化SQL,
3) NULL值可能会导致索引失效。
如果将字段默认设置成一个空字符串或常量值,并没有什么不同,且都不会影响到应用逻辑,那就可以将这个字段设置为NOT NULL
九,合理添加索引
当设计表时,需要考虑哪些字段需要加索引,可以遵循以下几个原则:
1,根据在查询中使用了某个字段作为查询条件,那么这个字段应该建立索引。例如,在用户表中,如果需要根据用户的姓名进行查询,那么就应该为姓名字段建立索引。
2,区分度高的字段优先:如果一个字段的取值范围非常小,例如:性别只有男和女两种可能,那么这个字段就不适合建立索引。相反,如果某一个字段的取值范围很大且区分度高,例如:用户ID,那么就这个字段就非常适合建立索引。
3,不要建立过多索引:每个表所建立的索引数量应该控制在一个合理的范围内,一般不要超过5个,因为过多的索引会导致写入速度变慢,并占用更多的存储空间。
4,联合索引优化:在某些情况下,可以通过联合索引的方式来优化查询速度,减少所需的索引数量。例如:在用户表中,如果需要根据用户姓名和年龄进行查询,那么可以将这两个字段组合成联合索引。
假设你有一个订单表,包含订单ID,用户ID,订单金额,订单状态等字段,现在需要根据用户ID和订单状态进行查询,可以考虑为用户ID和订单状态这个两个字段建立联合索引,例如:
CREATE TABLE order_tab (
    id int(11) NOT NULL AUTO_INCREMENT,
    user_id int(11) NOT NULL,
    amount decimal(10,2) NOT NULL,
    status varchar(20) NOT NULL,
    create_time datetime NOT NULL,
    PRIMARY KEY (id),
    KEY idx_user_status(user_id,status)USING KTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
十,不需要严格遵守3NF,通过业务字段冗余来减小表关联,简单来说就是反范式设计,常见形式是在第三范式(3NF)的基础上,进一步进行冗余,从而减少表关联。
回顾一下什么是数据库三范式(3NF)?
第一范式:对属性的原子性,要求属性具有原子性,不可再分解;
第二范式:对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖;
第三范式:对字段的冗余性,要求任何字段,不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;
假设需要设计一个产品订单表,包含以下字段:订单ID,用户ID,订单日期,产品名称,产品价格,产品数量以及订单总价,正常情况下,可能会分别设计订单表和产品表,并使用外键进行关联,例如:
订单表
CREATE TABLE order (
    'id' int(11) NOT NULL AUTO_INCREMENT,
    'user_id' int(11) NOT NULL,
    'order_date' date NOT NULL,
    'product_id' int(11) NOT NULL,
    'quantity' int(11) NOT NULL,
    PRIMARY KEY ('id'),
    FOREIGN KEY('product')REFENCES 'product'('id')
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
十一,避免使用MYSQL保留字
如果库名,表名,字段名等属性含有保留字,SQL语句必须用反引号来引用属性名称,这将使得SQL语句书写,SHELL脚本中变量的转义等变得非常复杂。
如果你需要使用这些保留字作为表名,列名或者其他标识符,你可以考虑以下方法来避免冲突:
1,在标识符前或后添加下划线:例如,将表名命名为 "my_table",列名命名为 "column_name".
2, 使用不同的单词或短语:例如,将表名命名为 "orders_table",列名命名为 "column_name".
3,使用反引号(): 将标识符括起来:例如,将表名命名为 "table",列名命名为 "column",请注意,使用反引号时要小心,确保使用正确的语法和规范。
常见保留字:
ADD ALL ALTER AND AS BETWEEN BY CASE DELETE FROM GROUP HAVING INSERT INFO JOIN LIKE
十二,不搞外键关联一般都在代码维护
在数据库设计中,使用外键关联是一种良好的实践,可以确保数据库的完整性和一致性,外键关联可以帮助维护表之间的关系,防止无效或不一致的数据插入,更新或删除操作。然而,在某些情况下,也存在一些缺点,这可能是导致现在不太推荐使用外键关联的原因之一,以下是一些这种情况:
1,可能会导致性能问题,尤其是在对大型数据里进行操作时,这是因为每次插入,更新或删除操作,都需要进行约束检查,这可能会导致额外的开销和延迟。
2,可能会限制数据库的灵活性和可扩展性,例如:如果需要对数据库进行分区或垂直分割,外键关联可能会导致额外的安全性和限制。
3,可能会导致死锁和死循环,特别是在进行开发操作时,这可能会导致数据库出现不稳定的状态,从而影响系统的性能和可用性
4,可能会导致数据库的维护和管理成本的增加,这是因为外键关联需要额外的管理和维护工作,例如:添加,修改或删除外键约束时需要额外的测试和验证。
因此,在决定是否使用外键关联时,需要考虑实际业务需求和场景,并进行数权衡和决策。在某些情况下,可以采用其他方法来保证数据的完整性和一致性。例如,使用应用程序逻辑和数据库触发器来实现约束检查和数据操作。同时,需要注意数据库设计的基本原则和最佳实践,例如,避免数据冗余,遵循规范化原则和正常化理论等。
十三,字段注释
设计表时,每个字段的含义要注释清楚,包括拨号类型。比如说:
'order_status' varchar(2) COLLATE utf8_bin NOT NULL COMMENT '订单状态01;待支付02;已支付03;已发货04;已完成05;'
十四,时间的类型选择
时间类型的选择一般都要好好考虑,因为不同的类型存储的格式不同。
对于MYSQL来说,主要有 date ,datetime ,time,timestamp和year.
1, date: 表示的日期值,格式 yyyy-mm-dd,范围1000-01-01到9999-12-31,3个字节
2,time:表示的时间值,格式 hh:mm:ss,范围-838:59:59到838:59:59,3个字节
3,datetime:表示日期时间值,格式 yyyy-mm-dd hh:mm:ss 范围1000-01-01 00:00:00到9999-12-31 23:59:59,8个字节,跟时区无关
4,timestamp: 表示的时间戳值,格式为yyyymmddhhmmss,范围1970-01-01 00:00:01 到2038-01-19 03:14:07,4个字节 跟时区无关
5,year: 年份值,格式为yyyy,范围1901到2155,1个字节
推荐优先使用datetime类型来保存日期和时间,因为存储范围更大,跟时区无关。
十五,SQL编写的一些优化经验
1,避免使用SELECT * FROM 语句,应该只选择需要的列以减少网络传输和提高查询性能。
2,使用索引来提高查询速度,特别是在对大型表进行查询时。
3,避免使用外键约束,因为他们可能会导致性能问题,特别是在对大型表进行插入,更新和删除操作时。
4,使用LIMIT 1来限制查询结果只有一条记录。
5,避免在where子句中使用OR来连接条件,应使用UNION来连接查询。
6,注意优化LIMIT源分页问题,可以使用OFFSET来替代LIMIT.
7,使用where条件限制要查询的数据,避免返回多余的行。
8,尽量避免在索引列上使用MYSQL的内置函数,这可能导致索引无效。
9,应尽量避免在where子句中对字段进行表达式操作,这可能导致索引无效。
10,应尽量避免where子句中使用 != 或 <> 操作符,这可能导致索引无效。
11,使用联合索引的时候,注意索引列的顺序,一般遵循最左匹配原则。
12,对查询进行优化,应考虑在where及order by涉及的列上建立索引。
13,如果插入数据过多,考虑批量插入。
14,在适当的时候,使用覆盖索引。
15,使用EXPLAIN分析 你SQL所计划

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

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

相关文章

使用WebVTT和Track API增强HTML5视频的可访问性和互动性

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebVTT和Track API增强HTML5视频的可访问性和互动性 使用WebVTT和Track API增强HTML5视频的可访问性和互动性 使用WebVTT和T…

vue2中引入cesium全步骤

1.npm 下载cesium建议指定版本下载&#xff0c;最新版本有兼容性问题 npm install cesium1.95.0 2.在node_models中找到cesium将此文件下的Cesium文件复制出来放在项目的静态资源public中或者static中&#xff0c;获取去github上去下载zip包放在本地也可以 3.在index.html中引…

VTK知识学习(9)-空间变换

1、前言 在三维空间里定义的三维模型&#xff0c;最后显示时都是投影到二维平面&#xff0c;比如在屏幕上显示。 三维到二维的投影包括透视投影&#xff08;Perspective Projection&#xff09;和正交投影&#xff08;Orthogonale Projection&#xff09;。正交投影也叫平行投…

Python学习从0到1 day29 Python 高阶技巧 ⑦ 正则表达式

目录 一、正则表达式 二、正则表达式的三个基础方法 1.match 从头匹配 2.search&#xff08;匹配规则&#xff0c;被匹配字符串&#xff09; 3.findall&#xff08;匹配规则&#xff0c;被匹配字符串&#xff09; 三、元字符匹配 单字符匹配&#xff1a; 注&#xff1a; 示例&a…

日常ctf

15&#xff0c; [MoeCTF 2021]Web安全入门指北—小饼干 直接改就行了 16&#xff0c; [MoeCTF 2021]2048 传入参数就获取到flag了 /flag.php?score500000000 17&#xff0c; [SWPUCTF 2022 新生赛]funny_web 账户密码是 NSS 2122693401 登录进去查看源码 考intval缺陷&…

【MySql】实验十六 综合练习:图书管理系统数据库结构

文章目录 创建图书管理系统数据库结构一、创建数据表1.1 book表1.2 reader表1.3 borrow表 二、插入示例数据2.1 向book表插入数据2.2 向reader表插入数据2.3 向borrow表插入数据 三、查询操作3.1 根据语义为借书表borrow的bno列和 rno列建立外键3.2 查询张小海编写的“数据库原…

通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

目录 通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制 一、引言 二、语义搜索与 MongoDB Atlas 的背景 三、MongoDB Atlas 的向量搜索功能 1. 向量搜索的实现方式 2. 典型操作示例 四、RAG 在 MongoDB Atlas 的应用 1、RAG是什么 2、RAG 的实现过程 3、RA…

51单片机基础01 单片机最小系统

目录 一、什么是51单片机 二、51单片机的引脚介绍 1、VCC GND 2、XTAL1 2 3、RST 4、EA 5、PSEN 6、ALE 7、RXD、TXD 8、INT0、INT1 9、T0、T1 10、MOSI、MISO、SCK 11、WR、RD 12、通用IO P0 13、通用IO P1 14、通用IO P2 三、51单片机的最小系统 1、供电与…

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版&#xff0c;外加输入法、IDEA等&#xff0c;我想将这个虚拟机里的系统直接搬到物理机中&#xff0c;那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了&#xff0c;那直接说干就干。 本教程基于Ubuntu24.0…

萤石设备视频接入平台EasyCVR私有化视频平台视频监控系统的需求及不同场景摄像机的选择

在现代社会&#xff0c;随着安全意识的提高和技术的进步&#xff0c;安防监控视频系统已成为保障人们生活和财产安全的重要工具。EasyCVR安防监控视频系统&#xff0c;以其先进的网络传输技术和强大的功能&#xff0c;为各种规模的项目提供了一个高效、可靠的监控解决方案。以下…

基于yolov8、yolov5的行人检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;行人检测在交通管理、智能监控和公共安全中起着至关重要的作用&#xff0c;不仅能帮助相关部门实时监控人群动态&#xff0c;还为自动化监控系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的行人检测模型&#xff0c;该模型使用了…

Django5 2024全栈开发指南(二):Django项目配置详解

目录 一、基本配置信息二、资源文件配置2.1 资源路由——STATIC_URL2.2 资源集合——STATICFILES_DIRS2.3 资源部署——STATIC_ROOT2.2.4 媒体资源——MEDIA 三、模板配置四、数据库配置4.1 mysqlclient连接MySQL4.2 pymysql连接MySQL4.3 多个数据库的连接方式4.4 使用配置文件…

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章&#xff0c;本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状&#xff0c;我们会从国内大户型和小户型的网络说起&…

一文速学---红黑树

文章目录 一、红黑树简介二、 红黑树特性三、红黑树插入3.1 红黑树为空3.2 父节点为黑色3.3 父节点为红色3.3.1 父亲和叔叔都是红色3.3.2 父节点为红色&#xff0c;叔叔节点为黑色3.3.2.1 父节点在左节点&#xff0c;插入节点在父亲左节点3.3.2.2 父节点在左节点&#xff0c;插…

学习日记_20241117_聚类方法(高斯混合模型)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

ISP——你可以从这里起步(二)

接上一篇&#xff0c;上一篇是原理篇&#xff0c;这一篇是实战篇&#xff0c;为了实现下面框图中的不完美ISP。 第一章 做一张RAW图自己用 不是所有的人都能获得raw图&#xff0c;即使获得了raw图也需要对应的sensor参数才能把它用起来&#xff0c;所以我找了一条野路子可以把…

shell bash---类似数组类型

0 Preface/Foreword C/C,Python&#xff0c;Java等编程语言&#xff0c;都含有数组类型&#xff0c;那么shell脚本是不是也有类似的语法呢&#xff1f; 1 类似数组类型 1.1 &#xff08;&#xff09;类似数组类型 #! /bin/bashecho "Welcome to bash world!" anim…

QT中使用图表之QChart绘制面积图

绘制面积图&#xff0c;则系列选择面积系列QAreaSeries 需要给系列设置上折线和下折线&#xff08;QLineSeries&#xff09;&#xff0c;如果没有设置下折线&#xff0c;则默认x轴为下折线 1、创建图表视图 //1、创建图表视图 QChartView * view new QChartView(this); //开…

H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

第02章 CentOS基本操作

2.文件基本操作【文件操作&#xff08;一&#xff09;】 目标 理解Linux下路径的表示方法能够使用命令(mkdir和touch)在指定位置创建目录和文件能够使用命令(rm)删除指定的目录和文件能够使用命令(ls)列出目录里的文件能够使用命令(cat,head,tail,less,more)查看文件内容理解标…