前言:

在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名、字段名命名混乱、字段类型设计混乱等等,此类数据库后续极难维护与拓展。我一直相信只有优秀的库表设计才能发挥出MySQL最大的性能,前面有篇文章也分享了数据库的使用规范,本篇文章主要讲几个库表设计的小技巧,希望对大家有所启发。

1.int类型的选用

整型字段类型包含 tinyint、smallint、mediumint、int、bigint 五种,占用空间大小及存储范围如下图所示:

存储字节越小,占用空间越小。所以本着最小化存储的原则,我们要尽量选择合适的整型,下面给出几个常见案例及选择建议。

根据存储范围选择合适的类型,比如人的年龄用 unsigned tinyint(范围 0~255,人的寿命不会超过 255 岁);海龟就必须是smallint,但如果是太阳的年龄,就必须是int。

若存储的数据为非负数值,建议使用 UNSIGNED 标识,可以扩大正数的存储范围。

短数据使用 TINYINT 或 SMALLINT,比如:人类年龄,城市代码。

存储状态变量的字段用?TINYINT ,比如:是否删除,0代表未删除 1代表已删除。

主键列,无负数,建议使用 INT UNSIGNED 或者 BIGINT UNSIGNED;预估字段数字取值会超过 42 亿,使用 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来说,存什么拿到的就是什么。下面给出几个常见案例及选择建议。

根据存储范围来选取,比如生产时间,保质期等时间建议选取datetime,因为datetime能存储的范围更广。

记录本行数据的插入时间和修改时间建议使用timestamp。

和时区相关的时间字段选用timestamp。

如果只是想表示年、日期、时间的还可以使用 year、 date、 time,它们分别占据 1、3、3 字节,而datetime就是它们的集合。

如果timestamp字段经常用于查询,我们还可以使用MySQL内置的函数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)

3.存储IP值

IP值一般使用char或varchar进行存储,但是当进行查找和统计时,字符类型不是很高效。MySQL数据库内置了两个IP相关的函数INET_ATON()、INET_NTOA(),可以实现 IP 地址和整数类型的转换。转换后使用可以INT UNSIGNED 来存储IP,转换后的数字是连续的,提高了查询性能,占用空间更小。

CREATE TABLE `tb_ip` (

`increment_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增主键‘,

`name` varchar(100) NOT NULL COMMENT ‘姓名‘,

`inet_ip` int(10) unsigned NOT NULL COMMENT ‘IP‘,

PRIMARY KEY (`increment_id`),

KEY `idx_inet_ip` (`inet_ip`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘ip测试表‘;

# 插入数据

insert into `tb_ip` (`name`,`inet_ip`) values

(‘wang‘,INET_ATON(‘192.168.0.1‘)),(‘lisi‘,INET_ATON(‘192.168.0.2‘));

# 相互转换

select INET_ATON(‘192.168.0.1‘);

select INET_NTOA(3232235521);

总结:

本篇文章分享了几个库表设计及字段类型选取的建议。这些案例都是常常见到的场景,对于int类型及时间类型的选取,本文也根据常见场景给出相关建议,希望大家读完这篇文章有所收获。其实库表设计是件复杂的事情,需要在项目前期多方人员共同规划讨论。还是那句话,只有优秀的库表设计才能发挥出MySQL最大的性能。

原文:https://www.cnblogs.com/kunjian/p/12849382.html

mysql datetime 对于hbm_MySQL库表设计小技巧相关推荐

  1. mysql设计技巧_MySQL库表设计小技巧

    前言: 在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名.字段名命名混乱.字段类型设计混乱等等,此类数据库后续极难维护与拓展.我一直相信只有优秀的库表设计 ...

  2. MySQL入门-day06-数据库表设计、视图、索引

    文章目录 数据库表设计 三大范式 第一范式 第二范式 第三范式 ER图与数据建模 什么是ER图 ER图核心要素 ER图实践 数据建模 外键约束与级联操作 外键 什么是外键? 什么是外键约束 外键对表的 ...

  3. MySQL - 库表设计之IP和TIMESTAMP的处理

    文章目录 学习更多干货 Pre TIMESTAMP IP 总结 学习更多干货 带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试 Pre MySQL - 高效的设计MySQL库 ...

  4. mysql 列换行 表设计 设计_今天来讲一下怎么利用MySql进行库表设计

    今天来讲一下怎么利用MySql进行库表设计 1 引擎选择 在 mysql 5.1 中,引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的 mysql 服务器中.使用 mysql 插件式存 ...

  5. MySQL之库表设计篇:一到五范式、BC范式与反范式详解

    引言 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑并不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多张表 ...

  6. 玩转MySQL:14000字来详解库表设计

    引言 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑并不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多张表 ...

  7. 计算机ppt技巧,5个PPT设计小技巧,让PPT不再呆板

    相信很多人在制作PPT的时候,会经常为排版而发愁,总是做不出好看的板式,或者做出来的PPT很呆板. (电脑入门到精通网 www.58116.cn) 那么,接下来为你介绍5个PPT设计小技巧,让你的PP ...

  8. UI界面如何制作?这些版式设计小技巧收藏好!

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 UI界面如何制作?这些版式设计小技巧收藏好!在做UI界面的时候,很多时候我们需要去看很多的产品进行竞品分析.市场调研 ...

  9. html5页面滑动设计,HTML5设计小技巧有哪些

    HTML5设计小技巧有哪些 你是否知道6个鲜为人知的HTML 5设计小技巧,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网! 慎用向右滑动操作.慎用横屏展示效果.按钮 ...

最新文章

  1. 【转】js frame 框架编程
  2. [文章集合] 在Windows Server 2012上关于Vmware的几点
  3. 用python朗读字母-使用python编写一个语音朗读闹钟功能的示例代码
  4. Spring Boot 自动配置之条件注解
  5. jackson java反序列化_java – Jackson JSON强制反序列化为对象
  6. 一致性 Hash 算法原理总结
  7. melis系统c800_一种基于Melis平台的卡拉OK系统的制作方法
  8. 算法实践--最小生成树(Kruskal算法)
  9. 数据可视化【八】根据数据类型选择可视化方式
  10. [转载]使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)...
  11. 函数setState是React的未来
  12. 使用 Laravel sharedLock 与 lockForUpdate 进行数据表行锁
  13. 高职计算机期末质量分析,利用SPASS进行计算机基础考试试卷质量分析
  14. A network analyzer is used for
  15. 基于Python的DELMIA二次开发(三):人体建模
  16. POSCMS 后台安全
  17. jstree 新建node后,刷新jstree的改变的那一部分
  18. 动态规划(3):最长非递减子序列
  19. 常见网络安全设备弱口令(默认口令)
  20. 爬虫练习-爬取笔趣阁小说

热门文章

  1. java js关键字_js中的instanceof关键字
  2. 上升沿_不懂上升、下降沿的我,高兴惨了!
  3. java 无限级_JAVA+Hibernate 无限级分类
  4. 三十六、贪心算法--集合覆盖问题
  5. PHP简单的字符串加密与加密代码
  6. ClickHouse系列教程
  7. linux 检查权限,检查目录下 文件的权限-linux shell脚本,
  8. hls二次加密 m3u8_HLS实战之Wireshark抓包分析
  9. C++_重载new,delete
  10. vscode 在ubuntu的terminal中下划线不显示解决方案