数据库
三范式
---
数据库的设计尽量符合三个范式(特殊要求可设置冗余字段加速查询)。
1. 1NF是对属性的原子性,要求属性具有原子性,不可再分解;
如学生(学号,姓名,性别,出生年月日),如果认为最后一列还可以再分成(出生年,出生月,出生日),它就不是一范式了
2. 2NF是对记录的惟一性,要求记录有惟一标识,即实体的惟一性,即不存在部分依赖;
如表:学号、课程号、姓名、学分;就不是一范式
正确做饭:
应该拆分成
学生:students(学号, 姓名);
课程:courses(课程号, 学分);
选课关系:student_course(学号, 课程号, 成绩)。
3. 3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;
如表: 学号, 姓名, 年龄, 学院名称, 学院电话;
因为存在依赖传递: (学号) → (学生)→(所在学院) → (学院电话) 。不符合范式;
正确做法:
学生:students(学号, 姓名, 年龄, 所在学院);
学院:colleges(学院, 电话)。
强制
---
1. 所有的数据库对象名称必须使用**小写字母**并用下划线分割(MySQL大小写敏感,名称要见名知意,最好不超过32字符)
2. 所有的数据库对象名称**禁止**使用MySQL保留**关键字**(如 desc、range、match、delayed 等,请参考:https://dev.mysql.com/doc/refman/5.7/en/keywords.html
3. 所有存储相同数据的列名和列类型必须一致。(在多个表中的字段如user_id,它们类型必须一致)
4. mysql5.5之前默认的存储的引擎是myisam,没有特殊要求,所有的表必须使用**innodb**(innodb好处支持失误,行级锁,高并发下性能更好,对多核,大内存,ssd等硬件支持更好)
5. 所有表和字段都要添**加注释**COMMENT,从一开始就进行数据字典的维护
6. 数据库和表的字符集尽量统一使用**utf8mb4**
7. 禁止在数据中存储图片,文件二进制数据(使用第三方存储)
优先
---
1. 区分度最高的列放在联合索引的最左侧
2. 尽量避免使用外键(禁止使用物理外键,建议使用逻辑外键)
3. 优先使用无符号的整形来存储
4. 优先选择存储最小的数据类型(varchar(N),N代表的是字符数,而不是字节数,N代表能存储多少个汉字)
5. 尽量把所有的字段定义为NOT NULL(索引NULL需要额外的空间来保存,所以需要暂用更多的内存,进行比较和计算要对NULL值做特别的处理)
6. 使用timestamp或datetime类型来存储时间
7. 财务相关的金额数据,采用decimal类型(不丢失精度,禁止使用 float 和 double)