文章摘自:

https://mp.weixin.qq.com/s?__biz=MzI2NDU3OTg5Nw==&mid=2247483799&idx=1&sn=4d1f45ab7d5bc9655a8fef2601171e52&chksm=eaab3fc1dddcb6d794dde2ee8e71a56a9b71fdc207efc033c56d1b53c7dc05b096e7cbc3482b&scene=21#wechat_redirect

utf8的锅

场景 : 之前在给客户做微商城时,需要保存微信的授权信息,此时就有一个nickname字段,在设计数据表时,潜意识的将表的存储格式设置为utf8,生产上线一段时间后偶尔出现保存异常。经分析,出现异常的原因是:用户nickname中有email表情符号。utf8格式的数据表存储不下导致。

经验提示: 在设计数据表时,一定要注意该字段存储的内容,如果允许设置表情,则一定不能使用utf8,而是使用utf8mb4。

选择合适的类型

在数据库表设计时,字段的类型还真不好设计,这里简单说说:

保存手机号的字段,用varchar(20)就已经足够了,就不应该设计为varchar(100),设置为varchar(100)只会消耗更多的存储以及内存开销,得不偿失啊!

保存Boolean类型,使用tinyint就够了,而不需要设计为int,甚至bigint。

数据类型设计的过大,就会造成没必要的浪费(磁盘,内存,CPU),最主要的是,这是一件费力不讨好的事情。

主外键字段类型不一致

主外键类型不一致,说起来,你可能会不相信,但在数据库表设计时,稍不留神,就不一致,埋下隐式类型转换的坑。如下:

用户表:

create table t_base_user(

oid bigint(20) not null primary key auto_increment comment "主键", ....

)

注意此时的主键oid为bigint(20)。

用户地址表:

create table t_base_user_address(

oid bigint(20) not null primary key auto_increment comment "主键",

user_id varchar(30) null comment "用户id" ....

)

你看,此时在t_base_user_address表中的user_id外键字段,设计时的却是varchar(30)。你可能觉得你不可能发生这样的错误,说出来也不怕你笑话,我就踩过好几次这样的坑,到最后发现慢SQL了,才发现自己中了这样的坑!!!

注释

之前在数据库表设计时,就没有加注释的习惯,造成的直接后果是:数据库设计阶段一过,后续数据表的使用中,字段名就全靠猜了。我们写代码是知道注释是非常重要的,同样在设计数据库表时,注释也非常重要!一定要记住加注释,无论是表,还是字段,索引,都必须加上注释。

如:

create table t_base_user(

oid bigint(20) not null primary key auto_increment comment "主键", ....

)

已有表加注释

alter table t_base_user modify oid bigint(20) not null primary key auto_increment comment "主键";

加注释时,还要注意的是:在一些需要计算的字段上,需要加上计算规则文档的链接。方便后续查找!

加索引

在之前的文章中也有说过,一个好的数据表设计,在一开始就应该考虑添加索引,这个阶段添加索引成本不仅最低。而且还不给后续留下慢查询,甚至生产事故的隐患!索引怎么加,索引重不重要,可以查看《写会MySQL索引》一文进行查看!唉,我就吃过不少没加索引或忘记添加索引的亏,记忆犹新!!!

小结

以上是我数据库设计表时躺过的坑,下面小结精简版本一下:

允许保存表情的表,存储格式设计为utf8mb4,避免使用utf8。

选择合适的数据类型。

主外键字段类型一定要一致,否则会造成隐式转化,不走索引,造成生产事故!

表以及字段上添加合理的注释。

数据库表设计时,一定要在外键字段以及合适的字段上加索引。

mysql栏目表设计_MySQL表设计相关推荐

  1. mysql 忽略表大小写_mysql表名忽略大小写问题记录

    问题描述: 一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下: mysql> show tables; +-- ...

  2. mysql 企业数据库设计_MySQL数据库设计

    MYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确(长度不能超过30个字符); 例如:user, stat ...

  3. mysql关系表控制_mysql表关系

    一.表的详细操作 1.修改表名 alter table 旧表名 rename 新表名; ​2.修改表的引擎与字符编码 alter table 表名 engine="引擎名" ch ...

  4. mysql right join实例_MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程

    LEFT JOIN 语法用法与实例MySQL LEFT JOIN 语法 SQL(MySQL) LEFT JOIN 会取得左表(table1)全部记录,即使右表(table2)并无对应匹配记录.LEFT ...

  5. mysql表类型_MySQL表类型的选择

    P131)创建表时的默认引擎是InnoDB,如果要修改默认的存储引擎,可以在参数文件中设置default-table-type.查看当前的默认存储引擎,可以使用一下命令: 创建新表的时候可以通过增加E ...

  6. mysql查看表描述_MySQL表记录操作介绍(重点介绍查询操作)

    MySQL表记录操作指的是对数据库表中数据进行CRUD增删改查操作,一下将一一给大家介绍,重点介绍查询操作. 一.插入数据(INSERT) 二.删除数据(DELETE) 三.修改数据(UPDATE) ...

  7. mysql 表 类型_mysql表类型

    MySQL支持6种不同的表类型:BDB.InnoDB.HEAP.ISAM.MERGE以及MyISAM.其中 BDB,InnoDB单独属于一类,称为"事务安全型"(transacti ...

  8. MySQL笔记创建表结构_MySQL表结构笔记9

    本篇大纲 MySQL数据表 创建表 创建主键 AUTO_INCREATE 指定默认值 更新表结构 删除表,重命名表 01:表 MySQL 数据库的表是一个二维表,由一个或多个数据列构成 每个数据列都有 ...

  9. mysql约束条件整型_MySQL 表的操作

    表的操作 创建表的完整语法: create table 表名( 字段名1 字段类型[(宽度) 约束条件], 字段名1 字段类型[(宽度) 约束条件], 字段名1 字段类型[(宽度) 约束条件] ); ...

最新文章

  1. nagios学习手札
  2. TeamCity+Rancher+Docker实现.Net Core项目DevOps
  3. 单元测试 python_Python单元测试简介
  4. post方法就反回了一个string字符串前台怎么接_Golang Web入门(2):如何实现一个RESTful风格的路由...
  5. 母亲确诊的员工发烧 当当网通知全员在家办公
  6. Html中 table,list等表格 中 js 的 Checkbox全选,反选,单选,获取数据选中行 的写法
  7. Spark MLlib(一)正则化特征
  8. [日志]怎样的男人才会讨美女喜欢?
  9. Thread.sleep(0) 到底有什么用?
  10. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(上)
  11. 用 IIS 进行ASP.NET 成员/角色管理(1):安全和配置概述
  12. java从0单排之java就业培训教程复习与面试题回顾——01
  13. java 循环读取文件_JAVA读写文件中的循环问题
  14. win7 蓝屏:stop 0x0000006b解决方法
  15. python抖音培训真的假的
  16. linux php 编程 pdf 百度云,Linux下的Perl编程 pdf版
  17. 阿卡迪亚大学计算机专业好考吗,阿卡迪亚大学很烂吗
  18. Linux修改系统时间为东八区北京时间(上海时间)
  19. HP11(HP其他喷头也可) 喷头程序开发项目外包
  20. 英国脑科学领域_来自英国A级算法崩溃的数据科学家的4课

热门文章

  1. Access denied for user(这个几乎让我怀疑人生的异常)
  2. 3——PHP 简单运算符的使用
  3. 在Windows下搭建Android开发环境及遇到的问题
  4. Python 学习笔记之字典(进阶篇)
  5. zend studio配置调试(Xdebug方式)
  6. 总结H3CNE学习过程和其他
  7. 一步一步搞定InfoPath(02)--配置VSTA
  8. Spring事务传播特性实例解析
  9. svn的更新、合并、提交
  10. linux centos 使用 alpine 编译的二进制文件 报错 /lib/ld-musl-x86_64.so.1: bad ELF interpreter 解决方法