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,形成映射关系(外键)。

关系

  1. 一对一
    比如将 address 从 customers 表分离出来,单独一张表,则该表和 customers 表就是一对一的关系,用户对应一个地址,地址对应一个用户。

  2. 一对多
    一个表中的一行,与另一个表中的多行具有关系。比如一个用户有多个订单,多行的表中应该有一个外键,参见上面的 customers, orders

  3. 多对多
    表中的多行,与另一个表的多行,具有关系,比如,books表,authors表,一本书可以由多个作者完成,多个作者又可以拥有多本书,这种情况下,一般可以引入第三张表 books_authors

    id book_id author_id

设计一个数据库

  1. 根据现实需要,创建表,比如我有一个书店,我应该有客户信息表 customers,下单表 orders,书籍信息表 books。
// customers
customerID    name    address    city

// orders
orderID    customerID    amount    date

// books
isbn    author    title    price
  1. 尽量不保存冗余字段
    先看个问题,为什么不将 customers表的字段,放到 orders 表存呢?
  • 一个客户的多个订单,会保存其个人信息多次,空间浪费。
  • 导致数据更新的不一致,比如客户有多个订单,修改了自己的地址,此时,如果订单没有全部都修改,则会导致地址不一致。
  • 其次,如果删除了所有的订单,客户信息也会随之丢失。
  1. 列不可再分
    也就是每列,只存一种属性的数据。
    比如,我的订单中,有哪些图书,可以这么设计:
  • orders表中,加一列字段 books,里面用,分割多本书。这种是不符合列不可再分的。
    orderID    customerID    amount    date    books
    1            2             111       xxx     00011abc,00012bbc
  • 因为订单和图书是多对多的关系,我们还可以加一张新表 order_books:
    id  orderID  isbn   quantity
  1. 唯一键
    就是保证表中的一条数据是唯一的,一般每个表都应该有一个主键,主键就可以保证唯一性了,当然也可以用其它方式,比如上面的 order_books表,不用id主键,orderID和isbn的组合也是唯一的,可以作为唯一键。

  2. 根据想要的数据,来建表
    比如,书店哪些图书卖的好,确定查的数据,数据库是否有,是否需要新建表收集。

  3. 避免空列
    比如,我要给图书加评论,可以有下面的方法:

  • 图书表加字段
    // books
    isbn   author  title  price  review
    但是这种,会造成 review 字段中,很多空值。
  • 单独一个表 books_reviews
    isbn   review

一套请求流程

MySQL 的基本概念

  1. 浏览器发起 http 请求到 nginx。
  2. nginx 收到请求后,解析一下文件,如果是 php文件,交给 PHP 引擎处理。
  3. PHP引擎解析脚本,如果有连接MySQL的指令,PHP 向mysql发送查询命令。
  4. MySQL server 接收查询指令并处理,返回结果到 PHP引擎。
  5. PHP引擎执行完后,返回一个html内容。
  6. web server 返回 html 给客户端浏览器。

为了性能提高,我们的MySQL server 一般单独一台主机部署。

PHP代码根据业务分层

也就是常说的 mvc 架构。

MySQL 的基本概念

如有任何侵权行为,请通知我删除,谢谢大家!
个人邮箱:865460609@qq.com

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
Junwind
讨论数量: 0
发起讨论 只看当前版本


暂无话题~