前言:
【MySQL数据库实战教程-73-表的设计经典设计方案】在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名、字段名命名混乱、字段类型设计混乱等等,此类数据库后续极难维护与拓展 。我一直相信只有优秀的库表设计才能发挥出MySQL最大的性能,前面有篇文章也分享了数据库的使用规范,本篇文章主要讲几个库表设计的小技巧,希望对大家有所启发 。
1.int类型的选用整型字段类型包含 tinyint
、smallint
、mediumint
、int
、bigint
五种,占用空间大小及存储范围如下图所示:
文章插图
存储字节越小,占用空间越小 。所以本着最小化存储的原则,我们要尽量选择合适的整型,下面给出几个常见案例及选择建议 。
CREATE TABLE `tb_int` ( `increment_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增主键‘, `stu_age` tinyint unsigned NOT NULL COMMENT ‘学生年龄‘, `is_deleted` tinyint unsigned DEFAULT ‘0‘ COMMENT ‘0:未删除 1:删除‘, `col1` bigint NOT NULL COMMENT ‘bigint字段‘, PRIMARY KEY (`increment_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘int测试表‘;
2.时间类型的选用时间字段类型可以选用datetime和timestamp,下面用一张表展示下二者的区别:文章插图
timestamp翻译为汉语即"时间戳",它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数,占用4个字节,而且是以UTC的格式储存,它会自动检索当前时区并进行转换 。datetime以8个字节储存,不会进行时区的检索 。也就是说,对于timestamp来说,如果储存时的时区和检索时的时区不一样,那么拿出来的数据也不一样 。对于datetime来说,存什么拿到的就是什么 。下面给出几个常见案例及选择建议 。
FROM_UNIXTIME()
、UNIX_TIMESTAMP()
,将日期和时间戳数字来回转换,转换后可以用 INT UNSIGNED 存储时间,数字是连续的,占用空间更小,并且可以使用索引提升查询性能 。下面给出示范建表语句及时间戳相关转换SQL:CREATE TABLE `tb_time` ( `increment_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增主键‘, `col1` datetime NOT NULL DEFAULT ‘2020-10-01 00:00:00‘ COMMENT ‘到期时间‘, `unix_createtime` int unsigned NOT NULL COMMENT ‘创建时间戳‘, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间‘, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改时间‘, PRIMARY KEY (`increment_id`), KEY `idx_unix_createtime` (`unix_createtime`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘time测试表‘;# 插入数据insert into tb_time (unix_createtime,create_time) values (UNIX_TIMESTAMP(now()),now());# 时间戳数字与时间相互转换select UNIX_TIMESTAMP(‘2020-05-06 00:00:00‘)select FROM_UNIXTIME(1588694400)
- 如何了解数据库?
- MySQL教程5 MySQL8存储引起 2.MySQL8锁策略 学习猿地
- MySQL教程3 MySQL8操作数据表中记录 13.MySQL多表更新 学习猿地
- MySQL教程-19-数据排序
- mysql:索引的本质详解
- mysql事务的隔离性等级事故
- mysql:索引之二叉树初步理解
- 学生管理系统 SQL Server数据库项目
- mysql:数据库之删除记录对自动增长的影响
- 不懂数据库知识的前端后端程序员就真可能变成猿吗