一、MySQL 数据库

什么是 MySQL 数据库,MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内;这样就增加了速度并提高了灵活性。
MySQL 数据库特点:

1. MySQL 是关系型数据库管理系统
2. 体积小,灵活性强,速度快
3. 源码开放,成本低,可移植性强

二、数据库三大范式

什么是范式(NF= NormalForm),范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式:
第一范式:保证列的原子性,保证列不可再分
第二范式:唯一性 ;一个表只说明一个事物;有主键且非主键依赖主键;(限制多对多的关系,建立一个关联表,通过外键和联合主键来关联两张表)
第三范式:每列都与主键有直接关系,不存在传递依赖;(限制一对多的关系,在从表中建立一个外键,通过外键来引用主表的信息)
注意:第二范式要遵循第一范式,第三范式要遵循第二范式

三、 MySQL 常见数据类型

1. 整型

MySQL数据类型含义(有符号)tinyint 1个字节

范围(-128~127) smallint 2 个字节

范围(-32768~32767) mediumint 3 个字节

范围(-8388608~8388607)int 4 个字节

范围(-2147483648~2147483647) bigint 8 个字节

范围(+-9.22*10的18次方)

在int类型里,都是用来存储整形数据,可以根据实际需要选取数据类型。

取值范围如果加了unsigned,则最大数值范围翻倍,比如 tinyint unsigned的取值范围为(0~256)。

int(m)里的m是表示SELECT查询结果集中的显示宽度,无实际意义,不影响实际的取值范围

2. 浮点型

MySQL 数据类型含义 float(m,d) 单精度浮点型

8 位精度(4字节)

m 总个数,d 小数位 double(m,d) 双精度浮点型

16 位精度(8字节)

m 总个数,d 小数位 decimal(m,d) 定点数

总个数 m<38, d 小数位

设一个字段定义为 float(5,2),如果插入一个数 123.45678 ,实际数据库里存的是 123.46(四舍五入)

3. 字符串

MySQL 数据类型含义 char(n) 固定长度

最多 255 个字符 varchar(n) 可变长度

最多 65535 个字符 tinytext 短文本字符串

最多 255 个字符 text 长文本数据

最多 65535 个字符 mediumtext 中等长度文本数据

最多 2 的 24 次方 -1 个字符 longtext 超长文本数据

最多 2 的 32 次方 -1 个字符

注意:char 和 varchar 区别!!!
a. char(n) 若存入字符数小于 n,则以空格补于其后,查询之时再将空格去掉。所以 char 类型存储的字符串末尾空格将被删除
b. char(n) 固定长度,char(4) 不管是存入几个字符,都将占用 4 个字节,varchar 是存入的实际字符数 +1 个字节(n<=255)或 2 个字节 (n>255),所以 varchar(5), 存入 3 个字符将占用 4 个字节。
3. char 类型的字符串检索速度要比 varchar 类型的快。总之,字符长度经常变化用varchar,固定长度用char, 超过255字符用varchar和text,能用varchar不用text。

4. 日期时间类型

MySQL数据类型字节含义date4字节日期值

例 '2020-02-02'time3字节时间值

例 '12:01:02'datetime8字节日期时间

例 '2020-02-02 12:02:02'timestamp4字节自动存储记录修改时间

5. 那么如何选取数据类型?

1. 按需选用‘短’数据类型
2. 对于int类型的,如果不需要存取负值,最好加上 unsigned
3. 字符串优先选用char(n)和varchar(n),长度不够时选用text数据类型
4. 避免使用 Null,NULL是列默认的属性,通常我们要指定为NOT NULL。有NULL的列值会使得索引、索引统计和值比较更加复杂。

四、AOS 系统 数据库设计个别分享

1. 方案追踪记录档
由于方案追踪记录档系统的数据字段较多,所以使用了数据库设计的 3 个范式。将旧系统的一个表有 100 多个字段(由于篇幅问题不在此分享),拆分为好几个新表,如下

## 1. aos_project

序号|字段|类型|说明
:----|:----|:---|:---|
1|id|int(11)|表的主键
2|project_id|varchar(15)|方案编号
3|order_number|varchar(15)|订单编号
4|propose_id|varchar(50)|提议人id
5|atme_id|varchar(50)|atme员工表id
6|atme_boss|varchar(50)|atme 主管员工表id
7|department_id|int(10)|方案所属部门id
8|egname|varchar(100)|必须,方案名称
9|description|varchar(2000)|必须,方案功能描述
10|calculate_tam|tinyint(1)|必须,预估的 TAM; 1 超大 2 大型 3 中型 4 小型 5 微小
11|market_status|tinyint(1)|必须, 市场的状态; 1 成熟 2 运作 3 成型 4 蹲点
12|our_status|tinyint(1)|必须, 我们的状态; 1 成熟 2 运作 3 成型 4 蹲点
13|chname|varchar(100)|方案名称(中文)
14|good|varchar(500)|做方案的好处
15|calculate_expert|varchar(30)|专家组,员工id
16|level|tinyint(1)|方案层次(1 C; 2 S; 3 T)
17|area|varchar(10)|区域
18|created_at|int(11)|创建时间
19|updated_at|int(11)|修改时间
20|begin_time|int(11)|方案实际开始时间
21|end_time|int(11)|方案实际结束时间
22|status|tinyint(1)|方案状态,0 等待中 waiting 1 进行中 doing  2 完成 finished 3 暂停 pending 4 异常 abnormal
23|estimate_start|int(11)|预估开始时间
24|estimate_end|int(11)|预估结束时间
25|reason|varchar(100)|原因
方案应用表

## 2. aos_project_application

序号|字段|类型|说明
:----|:----|:---|:---|
1|id|int(11)|表的主键
2|project_id|int(11)|方案表id
3|application_id|int(11)|应用ID
方案组件表
## 3. aos_project_components

序号|字段|类型|说明
:----|:----|:---|:---
1|id|int(11)|表的主键
2|project_id|int(11)|方案表id
3|brand_id|int(11)|厂牌表id
4|meterial_id|int(11)|料号表id
5|function_id|varchar(50)|功能表ID
方案工程师表

## 4. aos_customer

序号|字段|类型|说明
:----|:----|:---|:---|
1|id|int(11)|表的主键
2|name|varchar(25)|客户名称
3|created|int(11)|创建时间
方案工程师表

## 6. aos_project_engineer

序号|字段|类型|说明
:----|:----|:---|:---|
1|id|int(11)|表的主键
2|project_id|int(11)|方案表id
3|employee_id|int(11)| 工程师,员工id
4|type_id|tinyint(3)|工程师标签表ID
5|status|tinyint(1)|工程师状态,0 未开始,1 正在做,2 量产,3 已暂停,4 异常

重新按照数据库的三大范式设计数据库,使得数据表不大,而且查询快速。数据内容不冗余。