Reference: MySQL 8.0 Reference Manual
1. EER Model
由 database 创建 EER Model,效果如下 
1.1 创建方式

然后选取目标数据库,其中可以进行一些自定义操作比如只选取部分tables
1.2 特点
可视化地展现各表单的内容以及它们之间的关系,尤其是能清晰展现主键和外键
1.3 示例
人力资源管理系统 
2. ER模型
Entity Relation(ER),是一种数据库的概念设计方式
2.1 组成部分

2.2 主要步骤
- 确定实体(Entity)
- 设计实体的属性
- 设计实体之间的联系
- 确定实体的键
- 确定关系类型
2.3 应用示例
公司员工和部门
- 确定员工和部门分别为两个实体
- 给每个实体设计属性
- 明确实体间的关系:员工
work in部门,且该关系包含一个时间属性since


3. 设计范式
3.1 1NF
不能有多属性的列
3.2 2NF & 3NF
主键唯一,且其他列必须依赖于该主键(直接相关)
例如下图中的 Capacity 不依赖于主键 Name

因此需要做如下分割

4. 导入数据
4.1 导入 csv
在左侧SCHEMAS栏中,右键单击目标表单,选择 Table Data Import Wizard
4.2 导入过程中的问题
4.2.1 数据类型不匹配
成功导入的前提是数据类型能够完全匹配。例如,在csv文件中某一列存储的时间格式是这样的 2021.12.21-08:08:08,但我们在创建表单时为对应列分配的数据类型为 Datetime,这将导致整个文件都无法导入
对应的解决方式有:
- 使用python等工具直接修改csv文件中的时间格式
- 在MySQL中将对应列的
datetime类型改为varchar()
4.2.2 Foreign key的限制
外键的设置会限制导入数据的顺序,例如当表2的某列通过外键关联了表1的某列,那么表1就必须在表2之前导入,这就不太方便了
set foreign_key_checks = 0; -- 导入前关闭外键检查
set foreign_key_checks = 1; -- 导入后打开
5. 数据类型转换
对应 Section 4.1 中提到的 string to datetime 的问题,转化目标:
- 将字符格式
1987-06-21T04:00:00.000Z (string) - 转化为时间
1987-06-21 04:00:00.000 (datetime)
查找 Reference Manual 是否存在相关函数: 
找到函数:STR_TO_DATE(str, fomat)
select str_to_date('01,05,2013', '%d,%m,%Y');
完整示例:修改数据类型
create table employees(
employee_id int not null,
hire_date datetime
);
-- 为了能成功导入数据,先修改对应列的数据类型为 varchar()
alter table employees modify column hire_date varchar(255);
-- 使用 table import wizard 导入 csv
-- 数据类型转换
update employees set hire_date = str_to_date(hire_date, '格式');
-- 最后把对应列的数据类型改回 datetime
alter table employees modify column hire_date datetime;
Document Information
- Author: Zhekai Li
- Link: https://zhekaili.github.io/0009/02/01/MySQL-Database-Model-Design/
- Copyright: 自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)