数据库

三范式 --- 数据库的设计尽量符合三个范式(特殊要求可设置冗余字段加速查询)。 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)