### 设计基础
> 1.关系型数据库设计
**关系**
即一对一关联的实现方式是用外键,多对一关联的实现方式也是用外键,多对多关联的实现方式是用中间表。
**建表**
1.自增主键一般都需要设置(`id` int unsigned NOT NULL AUTO_INCREMENT);
2.不定长字符串长度使用varchar类型,需要考虑实际业务最长长度的基础上扩容20%到40%为宜,且长度取2的指数长为宜(64,128,256等);
3.定长长度使用char类型,长度直接取实际长度即可,类似于手机号字段;
4.所有字段除了软删除字段(delete_time),都需要设置为not null,并且设置默认值(字符串默认值为'',整型默认值为0);
5.基本所有的字段,表名都加上备注,除了自增主键,创建时间,更新时间之类的通用字段。
6.表结构需指定存储引擎,默认字符集。
7.关于索引的创建,建议只创建其它表在这个的表的外键和查询频繁的字段。其它字段在业务扩展时我会及时跟进并设定。
8.表名和字段名以英文加下划线隔分,字段中英文单词以不超过三个单词为宜。
> 更多
(1)状态字段设置为tinyint,同时备注写清楚不同数字代表的类型。
(2)时间字段都是存时间戳,以整形为宜。
* * * * *
> **如何选择存储引擎?**
关于这个问题,我们需要考虑每个存储引擎提供了哪些不同的核心功能,一般把这些核心功能分为4类:**支持的字段**和**数据类型**、**锁定类型**、**索引**和**事务处理。**
支持的字段和数据类型
虽然所有这些引擎都支持通用的数据类型,例如整型、实型和字符型等,但是,并不是所有的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。
锁定类型
锁定机制主要是为了防止多个处理同时更新同一个数据。不同的存储引擎支持不同级别的锁定:表锁定、页锁定和行锁定。
表锁定:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。支持最多的就是表锁定,MyISAM和MEMORY支持这种锁定。MySQL的表级锁有两种模式:表共享读锁和表独占写锁。对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!
行锁定:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。InnoDB表进行行级锁定。
页锁定:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。BerkeleyDB引擎支持页锁定。
索引
建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些存储引擎根本不支持索引。
事务处理
事务处理功能通过提供在向表中更新和插入信息期间的可靠性。
* * * * *