##概述
MySql项目实战是结合实际开发工作,来说明数据库分析,数据库设计,数据库创建等一些列流程。这部分知识不属于严谨的技术,不同的人有不同的方法,如果你不认可你可以继续自己的方法。但是每个方法都不是绝对完美,都存在优缺点,希望与志同道合之士一起讨论学习。
启动一个新项目,对数据库的操作一般按照下面几个步骤:
- 项目功能和逻辑分析。
- 数据库表关系设计。
- 数据库表创建。
- 数据库表使用。
##项目功能和逻辑分析
在互联网项目中,产品的作用是将用户的生活需求转化为产品需求,程序猿需要将产品逻辑转化为程序逻辑,然后再编码造出产品。
数据库的作用是存储数据,所以我们首先要做的就是分析项目的整体逻辑,找出需要存储的所有数据,将数据梳理为一个一个的实体对象,然后找到各个实体对象的对应关系。
由于数据库表的关系逻辑与项目的编码逻辑是紧密结合的,所以在数据库表设计时一定要全面考虑,适合扩展和维护,尽量避免出现数据库结构重构的现象,因为数据库结构重构必然会导致项目的代码重构。
##数据库表关系设计
一,常见的数据库表关系类型
常见的数据库表关系类型有:一对一,一对多,多对多。
1,一对一关系
在一对一关系中,A 表中的一行最多只能匹配于 B 表中的一行,B表中的一行也只能匹配A表中的一行。
这种关系的表,理论上可以合并为一个表,将列增加即可。但在实际开发中,有一些是核心信息,有些是不重要也不经常使用的附加信息,此时若都放在一个表中,则影响表的增删改查效率,此时就可以将这些不重要的也不经常使用的数据放入到另外一个表中。
一对一关系示例:企业员工表中的姓名,年龄,学历,手机号等为该员工的核心信息,可以方法核心表中。员工的父亲姓名,父亲联系方式等等为附加信息,则可以放到另外一个表中,两表之间构成一对一关系。
2,一对多关系
一对多关系是最常见的一种关系。它指A表中的一行数据可以匹配B表中多行数据,而B表中的一行数据只能匹配A表中的一行数据。
一对多关系示例:企业中员工表与员工的考勤表,工资表等都是一对多的关系。
3,多对多的关系
多对多的关系是指:A表中的一行数据可以匹配B表中多行数据,而B表中的一行数据也能匹配A表中的多行数据。
多对多关系示例:图书管中的读者与图书的关系属于典型的多对多的关系。
二,主键与外键的使用
上面将的一对多,多对多中的这种对应就需要主键和外键来实现。在A表中设置主键,然后在B表中设置与A表主键对应的外键,则A表与B表就有了关系。
下面分情况说明主键和外键设置习惯。
1,一对一关系
在一对一关系表中,通常在主要表中设置主键,然后在次要表中设置外键。
2,一对多关系
在一对多关系表中,通常在“一”表中设置主键,在“多”表中设置外键。
3,多对多的关系
在多对多的关系表中通常需要引用第三张表,称为关系表。在两个实体表中都设置主键,然后在关系表中设置外键。
注:
- 一个表中,要么有主键,要么有外键,否则这个表就是一个孤立的表。
- 在设有外键的表中一般也设置自己的主键,作用是便于扩展。
三,三大范式
三大范式是数据库届总结的设计原则,网上有很多讲解。推荐参考:https://www.cnblogs.com/knowledgesea/p/3667395.html
我的理解和总结如下。
第一范式:又称为原子性,即表中的所有字段都不能再拆分。
第二范式:表中的每一列都和主键有关。
第三范式:表中的每一列都是和主键有直接关系。
注:三大范式是理想原则,但在实际开发中还要考虑执行效率,编码逻辑等等因素,可以不严格遵守三大范式。
##常见情况的数据库表关系设计示例
一,权限管理
持续完善中。。。
二,字典值
持续完善中。。。
##数据库表关系图绘制
在数据库设计时需要画一些图来辅助我们,这样可以清晰展示各个表的字段及各个表直接的关系。
##UML图
UML是Unified Model Language的简称,意思是同一建模语言,java中的类关系图通常使用UML图,数据库表关系也可以使用UML图。
##ER图
ER图又称为实体关系图(Entity Relationship),是描述实体与实体之间的一种关系图。适用与一切实体,所以也适用与描述数据库关系图。
##PDM图
PDM的中文名称为产品数据管理(Product Data Management),专业表示数据库关系的图。
##常用的绘图软件
1,powerdesigner
powerdesigner是专业绘制PDM图软件,官网是:http://powerdesigner.de/
不幸的是powerdesigner居然没有mac版,每每想到此软件就怀念之前的Windows电脑。
2,visio
visio是专业绘制ER图的软件,是microsoft的软件,但不再office中。使用时需要单独下载。
又一大不幸,visio也没有mac版,mac用户的新又伤了一次。
3,edraw
edraw是一个多功能绘图软件,可以绘制流程图,思维导图,UML图,ER图等。官网地址:https://www.edrawsoft.com/
庆幸的是这个又mac版,但是收费,至今没找到mac的破解版。有mac破解版的同道请留言,不胜感激。
4,在线工具
最后再向大家推荐两款在新工具:
draw:https://www.draw.io/
ProcessOn:https://www.processon.com/
##数据库表创建
在MySql(一)之使用入门中已经讲过创建数据库和创建表的sql,但在实际开发中常常使用图形化客户端来操作。(有些大神都是在终端使用sql语句创建数据库表,可能我还没有达到大神的高度吧,我一直喜欢使用图形化客户端来操作)。
常用的操作数据库的图形化客户端如下:
一,workbench
workbench是mysql官网提供的图形化客户端,下载地址是:https://dev.mysql.com/downloads/workbench/
这是一个免费的软件。
二,sqlyog
三,navicate
navicat的官网是:https://www.navicat.com.cn
操作mysql数据库有两个版本,navicate for mysql和navicate premium。
navicate premium是一个非常强大的工具,可以操作mysql,oracle,SQLServer等各种数据库。
下面以navicate premium为例说明怎么创建数据库,及创建数据库时的注意点。
##使用navicate premium创建Mysql数据库和数据表
准备工作:
1,按照Navicate Preminu软件。
2,安装MySql软件。
一,连接数据库
在实际开发中,mysql通常在远程服务器上,所以此时你需要直到服务器的ip,mysql服务的端口号,还有数据库的账号密码。下面我以本地的数据为例说明怎么连接数据库。
1,打开Navicate Preminu,点击“File”->"New Connection"->"MySql",如下:
2,在弹出的对话框中填写数据库参数,如下:
注:在保存之前点击左下角的“Test Connection”可以测试连接,测试成功后再保存参数。
二,创建数据库
数据库一般是运维已经创建好的,我们选择打开就行。Navicate提供了创建数据库的功能,所以此时也做一个介绍。
右击刚才创建的连接,然后选择“New Database”,如下:
弹出一个对话框如下:
说明:
- 数据库名称是自己命名的。
- 编码格式一般选择utf8,此时设置的是数据库整体编码格式,是数据库表中字符串默认的编码格式,在创建数据库表时可以再指定具体字段的编码格式,数据最终的编码格式以数据库表中字段为准。
- Collation:表示字符串对比规则,一般选择utf8_general_ci。当对字符串排序,等于,like等操作时使用该规则。
三,创建数据库表
首先选择刚才创建的数据库,然后右击“Tables”,选择“New Table”,如下:
此时弹出一个对话框,输入信息如下:
下面对各个字段一一解释,如下:
1,id
选中id这一行,详细设置如下:
说明:
- id通常是int类型,length为11,这个11为固定写法,没有任何意义。
- id通常设为主键,在key下方点击,出现钥匙图标即设置为了主键。
- id通常设置为自增长,即选中Auto increment.
2,name
选中name这一行,详细设置如下:
说明:
- 对于字符串我们通常使用的数据类型是varchar,因为char是数据长度固定的,如果length等于10就会占10个长度。使用varchar是最大占用10个长度,如果不满10个长度则占用较少的长度。
- 此处可以修改编码格式。如果需要支持emoji表需要选择utf8mb4。因为utf8mb4的一个字符占用4个字节,所以如果不需要支持emoji表情,尽量不要选择。
- Default Value表示默认值,对于一切字段尽量设置默认值。
3,created_time
选中created_time这一行,详细设置如下:
说明:
- 时间常用的有两种类型,timestamp和timedate,timestamp以毫秒值存储,所以时间范围是1970到2038,timedate没有时间范围。所以在表示当前时间或者最近时间时使用timestamp。当表示过去时间或未来时间时使用timedate。
- 对于时间字段,Length设置为0.
- 时间字段的默认值可以设置为当前时间,CURRENT_TIMESTAMP。
- 时间字段也可以设置为随update操作更新时间。
4,high
说明:
- double类型的字段可以设置小数的位数,Decimals表示小数的位数。
- Length位总数字位数,包括小数位数和整数位数。
四,在navicate中执行sql语句
在navicate中可以书写sql语句并执行,如下:
此时会弹出一个可编辑的空白页面,如下:
- 说明:
- 在这一个页面中可以写多个sql语句,选中哪个执行哪个。
- 在页面上可以写注释
- 该页面可以保存。此保存是保存到本地。
五,导出sql文件和执行sql文件
navicate支持导出sql文件,这个sql文件包含创建数据库表的sql语句,然后在另外一个库中执行该sql文件,从而实现夸库复制表结构的功能。
导出sql文件的操作如下:右击某个表,选择“Dump SQL File”
说明:此时可以选中+Data,+Data表示带有数据。Only表示不带数据,仅仅包含表结构sql。
执行sql文件的操作:右击某个库,选中“Execute SQL File”
此时会弹出选中sql文件的对话框,找到sql文件所在的目录,选中sql文件即可。
六,navicate对表的其他操作
右击某张表,就可以到对这张表的所有操作:
说明:import Wizard和Export Wizard是常用两个功能,可以导入或导入各种文件类型的数据,包括excel,txt,xml等等。
##数据库的使用
所有数据库表的设计和创建都是为了在项目中使用,项目中可以使用任意框架连接数据库操作数据。