数据库表名,字段名,索引名等都要命名规范,可读性高
pk_字段名
,唯一索引名为uk_字段名
,普通索引名为idx_字段名
设计表时候,要选择合适的字段类型
tinyint, smallint,int,bigint
开始选择
archar
是可变长字符串,不预先分配空间,长度不要超过500
text
,同时抽出单独一张表,用主键与之对应
varchar
字段的长度加起来,不能大于65535
,如果又这样的需求,请使用text/longtext
类型
主键的设计最好不要与业务逻辑有所关联,主键最后是一串毫无意义,独立不重复的数字,比如:UUID,Auto_increment
,又或者是雪花算法生成的主键等等
在MySQL中,
varchar 和 char
类型表示字符长度,而其他类型表示的长度都表示字节长度。比如char(10)
表示字符长度是10,而bigint (4)
表示显示长度是 4 个字节但是因为bigint实际长度是 8 个字节,所以bigint (4) 的实际长度就是8个字节。
我们在设计表的时候,需要充分考虑一个字段的长度,比如一个用户名字段(它的长度5~20个字符) ,你觉得应该设置多长呢? 可以考虑设置为 username varchar (32)
。:字段长度一般设置为2的幂哈(也就是 2的n
次方)
is_deleted
,以标记数据已经逻辑删除了# 物理删除
delete from account_info_tab where account_no = '11';
# 逻辑删除
update account_info_tab set is_deleted = 1 where account_no = '11';
Why?
一张表的字段不要太多,一般尽量不要超过20个字段
Why? 如果一张表的字段过多,表中保存的数据可能就会很大,查询效率就会低
当表的字段数很多时,可以将表分为俩张表,一张作为条件查询表,一张作为详细内容
如果没有特殊的理由,一般都建议将字段定义为 NOT NULL
why?
NULL
值存储也需要额外的空间的,它也会导致比较运算更为复杂,使优化器难以优化SQL。NOT NULL
首先,评估表的数据量,如果数据量只有几十行,就没必要加索引。否则设计表的时候,如果有查询条件的字段,一般就要加索引
索引使用的注意事项:
如果有MySQL的保留着,可能会使得SQL语句编写,SHELL脚本中变量的转义变得非常复杂
这个在阿里的java
规范也有提到:
【强制】不得使用外键与级联,一切外键概念必须在业务层解决
一般中英文环境使用utf8mb4
推荐使用datetime
来保存日期和时间,存储范围更大,且和时区无关
存储过程:已预编译为一个可执行过程的一个或多个sql语句
触发器:指一段代码,当触发某个事件的时候,自动执行这些代码
原因:对于MYSQL来说,这俩个东西不是很成熟
有时候俩张表存在N:N关系时候,我们应该消除这种关系,通过增加第三张表,把N:N修改为俩个1:N
当碰到很大的数据的时候,不建议直接把表字段设计为text类型,可以保存到mongodb中,然后,在业务表保存对应的mongodb的id即可
原因:数据量太大的话,SQL的查询就会变慢。
又或者是把商品需要频繁增删改查的数据和基本不怎么用的数据给分离开来。
参考视频:21个MySQL表设计的经验准则