MySQL数据库设计原则

MySQL数据库设计原则
数据库范式
简单熟悉数据库范式
第一范式(1NF):字段值具有原子性,不能再分(所有关系型数据库系统都满足第一范式); 例如:姓名字段,其中姓和名是一个整体,如果区分姓和名那么必须设立两个独立字段;
第二范式(2NF):一个表必须有主键,即每行数据都能被唯一的区分; 第二范式的前提是必须满足第一范式;
第三范式(3NF):一个表中不能包涵其他相关表中非关键字段的信息,即数据表不能有沉余字段; 备注:第三范式的前提是必须先满足第二范式;
命名规范
数据库命名规范
采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线''组成; 命名简洁明确(长度不能超过30个字符); 例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀; 除非是备份数据库可以加0-9的自然数:user_db_20151210;
数据库表名命名规范
采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'
'组成; 命名简洁明确,多个单词用下划线''分隔; 例如:user_login, user_profile, user_detail, user_role, user_role_relation, user_role_right, user_role_right_relation 表前缀'user'可以有效的把相同关系的表显示在一起;
数据库表字段名命名规范
采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线''组成; 命名简洁明确,多个单词用下划线''分隔; 例如:user_login表,字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time; 每个表中必须有自增主键,add_time(默认系统时间) 表与表之间的相关联字段名称要求尽可能的相同;
数据库表索引命名规范
命名简洁明确,例如:user_login表user_name字段的索引应为user_name_index唯一索引;
设计大原则
1.平衡范式与冗余(效率优先;往往牺牲范式)
2.使用缓存表和汇总表能表进行数据库的查询优化。
3.不在数据库做运算, cpu计算务必移至业务层;
4.控制列数量(字段少而精,字段数建议在20以内);
5.拒绝3B(拒绝大sql语句:big sql、拒绝大事物:big transaction、拒绝大批量:big batch);

设计小原则
1.用尽量少的存储空间来存数一个字段的数据;例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);能使用tinyint就不要使用smallint,int; 最好给每个字段一个默认值,最好不能为null;
2.一般情况下,应该尽量使用可以正确存储数据的最小数据类型。数据类型不一样,存储的执行效率也不一样。最好使用适度的整型数据类型,例如int之类的数据,这样在做查询或者字段排序的时候速度是最快的。
3.字段尽量避免NULL值,因为这样会增加数据库处理的开销。但是也要考虑实际情况,不要一味的为了避免空值而全部设置为not null,具体的设置情况要根据项目的具体业务来。
4.注意char和varchar的使用,char适合存储的大小基本固定在一个范围之内,经常发生变动的数据。固定长度的类型最好使用char,例如:邮编。而varchar则不一样,varchar适合那种大小不固定,并未经常发生改动的数据。需要注意的是varchar定义的长度最好可以刚好够用,不然会照成资源的浪费,影响整体数据库的性能和存储空间。
5.少用text类型(尽量使用varchar代替text字段);
6.尽量不要使用联合主键,查询效率低。
7.合理使用索引(改善查询,减慢更新,索引一定不是越多越好);
8.Mysql数据库使用innodb引擎,主键推荐使用自增列(主键建立聚簇索引,主键不应该被修改,字符串不应该做主键)
sql类原则
1.SQL语句尽可能简单
  ①可能一条大SQL就把整个数据库堵死
  ②简单SQL缓存命中率更高, 减少锁表时间,特别是MyISAM ,用上多CPU
2.保持事务(连接)短小
①. 事务/连接使用原则:即开即用,用完即关
②. 不事务无关操作放到事务外面, 减少锁资源的占用
③. 不破坏一致性前提下,使用多个短事务代替长事务
3.尽可能避免使用SP/TRIG/FUNC(由客户端程序负责)
① 尽可能少用存储过程
② 尽可能少用触发器
③ 减用使用MySQL凼数对结果进行处理
4.尽量不用 SELECT *
①用SELECT * 时
Ⅰ更多消耗CPU、内存、IO、网络带宽
  Ⅱ 先向数据库请求所有列,然后丢掉不需要列
②尽量不用SELECT * ,叧取需要数据列
  Ⅰ 更安全的设计:减少表变化带来的影响
  Ⅱ 为使用covering index提供可能性
  Ⅲ Select/JOIN减少硬盘临时表生成,特别是有TEXT/BLOB时
5.改写OR语句(注意控制IN的个数,建议n小亍200,当n很大时,OR会慢很多 )
①同一字段,将or改写为in();OR效率:O(n) ;IN 效率:O(Log n)
②不同字段,将or改为union;减少对不同字段进行 "or" 查询; Merge index往往很弱智 , 如果有足够信心:set global optimizer_switch='index_merge=off';
6.避免负向查询和% 前缀模糊查询
  ① 避免负向查询 NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、 NOT LIKE等
② 避免 % 前缀模糊查询
Ⅰ B+ Tree Ⅱ 使用了索引 Ⅲ 导致全表扫描
7.减少COUNT()( found_rows()/row_count())'
  COUNT(
)的资源开销大,尽量不用少用
8.使用LIMIT的高效分页
9.用UNION ALL 而非 UNION
  若无需对结果进行去重,则用UNION ALL , UNION有去重开销
10.分解联接保证高并发
  高并发DB不建议进行两个表以上的JOIN
  • 适当分解联接保证高并发 Ⅰ 可缓存大量早期数据 Ⅱ 使用了多个MyISAM表Ⅲ 对大表的小ID IN() Ⅳ 联接引用同一个表多次
11.同数据类型的列值比较
  原则:数字对数字,字符对字符
  •数值列不字符类型比较
    Ⅰ同时转换为双精度 Ⅱ 进行比对
  •字符列不数值类型比较
     Ⅰ字符列整列转数值 Ⅱ会使用索引查询

你可能感兴趣的:(MySQL数据库设计原则)