8.1. MySQL 的基本概念
持之以恒,方得始终!
什么是 MySQL ?
mysql 是一种关系型数据库,与之对应的有非关系数据库,比如 redis,MongoDB。
既然是关系型,那数据之间肯定是有各种关联的,比如说,我的用户表,和用户地址表,用户收藏表,之间肯定是有纽带的,可能是这样:
user
id, name, age, phone, address_id, userlove_id ...
address
id, privince, city, area, user_id ...
userlove
id, love, user_id ...
mysql 本质上是一种数据存储管理的软件,它是 c/s 架构的,也就是有服务端程序去执行任务,客户端软件给出操作指令,查询数据等。
搭建 LNMP 环境
源码方式 参见此篇
window 也可以用 PHPstudy
软件,方便测试使用。类似的还有宝塔软件。
docker方式的话,可以参考这里
库 database
可以比作是目录,它下面就是放表的。
// 连接到本地 mysql
mysql -u root -p
// 显示所有数据库
show databases;
// 创建一个数据库 mydata
create database if not exists mydata;
表 table
数据库为目录,表就为目录下的文件了。
// customers 表
customerID Name Address City
1 xxx
2 yyy
3 zzz
每一行可以看做是一条数据,每一列就是一个属性
主键
上面表中的 customerID 就是一个主键,主键具有唯一性,也就是确定一条数据是唯一的。
注意:一个键可以有几个字段的。
再创建一张表,看下和上面的关系
// orders
orderID customerID amount date
1 3 22 xx
2 1 33 xx
orders 有一个 customerID 字段,对应 customers 表的 customerID,形成映射关系(外键)。
关系
一对一
比如将 address 从 customers 表分离出来,单独一张表,则该表和 customers 表就是一对一的关系,用户对应一个地址,地址对应一个用户。一对多
一个表中的一行,与另一个表中的多行具有关系。比如一个用户有多个订单,多行的表中应该有一个外键,参见上面的 customers, orders多对多
表中的多行,与另一个表的多行,具有关系,比如,books表,authors表,一本书可以由多个作者完成,多个作者又可以拥有多本书,这种情况下,一般可以引入第三张表 books_authorsid book_id author_id
设计一个数据库
- 根据现实需要,创建表,比如我有一个书店,我应该有客户信息表 customers,下单表 orders,书籍信息表 books。
// customers
customerID name address city
// orders
orderID customerID amount date
// books
isbn author title price
- 尽量不保存冗余字段
先看个问题,为什么不将 customers表的字段,放到 orders 表存呢?
- 一个客户的多个订单,会保存其个人信息多次,空间浪费。
- 导致数据更新的不一致,比如客户有多个订单,修改了自己的地址,此时,如果订单没有全部都修改,则会导致地址不一致。
- 其次,如果删除了所有的订单,客户信息也会随之丢失。
- 列不可再分
也就是每列,只存一种属性的数据。
比如,我的订单中,有哪些图书,可以这么设计:
- orders表中,加一列字段 books,里面用
,
分割多本书。这种是不符合列不可再分的。orderID customerID amount date books 1 2 111 xxx 00011abc,00012bbc
- 因为订单和图书是多对多的关系,我们还可以加一张新表 order_books:
id orderID isbn quantity
唯一键
就是保证表中的一条数据是唯一的,一般每个表都应该有一个主键,主键就可以保证唯一性了,当然也可以用其它方式,比如上面的 order_books表,不用id主键,orderID和isbn的组合也是唯一的,可以作为唯一键。根据想要的数据,来建表
比如,书店哪些图书卖的好,确定查的数据,数据库是否有,是否需要新建表收集。避免空列
比如,我要给图书加评论,可以有下面的方法:
- 图书表加字段
但是这种,会造成 review 字段中,很多空值。// books isbn author title price review
- 单独一个表 books_reviews
isbn review
一套请求流程
- 浏览器发起 http 请求到 nginx。
- nginx 收到请求后,解析一下文件,如果是 php文件,交给 PHP 引擎处理。
- PHP引擎解析脚本,如果有连接MySQL的指令,PHP 向mysql发送查询命令。
- MySQL server 接收查询指令并处理,返回结果到 PHP引擎。
- PHP引擎执行完后,返回一个html内容。
- web server 返回 html 给客户端浏览器。
为了性能提高,我们的MySQL server 一般单独一台主机部署。
PHP代码根据业务分层
也就是常说的 mvc
架构。
如有任何侵权行为,请通知我删除,谢谢大家!
个人邮箱:865460609@qq.com