第一范式1NF:属性不可分【反例:address可1分为国家,省市,地区】
第二范式2NF:属性完全依赖主键
【反例:订单编号和商品编号位于同一张表中,前者与订单信息强相关,后者与商品信息强相关】【该拆表了】
第三范式3NF:不允许数据冗余【两张表很多属性相同】
1,命名规范:小写+下划线,不能使用保留关键字
【MySQL对象名默认规定大小写敏感,且在生产环境中MySQL通常运行在Linux系统下,Linux系统本身也是大小写敏感的。】
【https://dev.mysql.com/doc/mysqld-version-reference/en/keywords-8-0.html
建议在设计数据表之后逐一排查有没有使用关键字。】
原则:
1,char VS varchar
? char 定长 浪费空间 查询速度快
? varchar 变长 节省空间 查询速度较慢
? 出于存储空间的考虑,优先选择varchar
2,避免使用text,blob,如果一定要使用,单独出扩展表
? 【MySQL内存临时表不支持text,blob这样的大数据类型,只能使用磁盘临时表完成,并且会导致二次查询】
3,同财务相关的最好使用定点数decimal
4,日期类型选择
1,为什么选择Innodb?【行级锁高并发,支持事务,缓存索引和数据,支持热备】
2,字符集通常选用UTF-8
3,所有表和字段都需要添加注释
4,禁止在数据库中存储图片,文件等大的二进制数据
通常存储于文件服务器,数据库只存储文件地址信息
5,尽可能把所有列定义为 NOT NULL
where子句中的字段
联合索引又称为复合索引,指查询中同时包含多个索引。
最左前缀匹配原则:MySQL遵循最左优先,所以在where子句中通常将使用最频繁的索引放在前面
禁止使用 SELECT * 必须使用 SELECT <字段列表> 查询
禁止使用 order by rand() 进行随机排序
WHERE 从句中禁止对列进行函数转换和计算
拆分复杂的大 SQL 为多个小 SQL
在明显不会有重复值时使用 UNION ALL 而不是 UNION
用join操作代替子查询
使用join关联的表最好不超过5个
对应同一列进行 or 判断时,使用 in 代替 or
外键是否需要问题
对于互联网行业,注重高并发,不推荐使用外键。【外键的本质就是将数据一致性交给数据库处理】
对于传统软件行业,对并发量没有那么高,通过使用外键来降低开发成本也是可取的
https://baijiahao.baidu.com/s?id=1622786252178335118&wfr=spider&for=pc
原文:https://www.cnblogs.com/noneplus/p/11570096.html