封面人物
刘承羽
前言
这是我学习《PHP和MySQL Web 开发》的读书笔记,一些重要的知识点我会记录下来,当然只会写我觉得重要的。
- 如果有幸有人看到这个学习笔记了,你要结合着书看,不要光看这个笔记。
- 在笔记里我会记录一些我学习中遇到的问题和解决办法与注意事项。
- 为了方便管理和查找,文章或者说笔记的目录我就按照书里的排了,方便对比着看。
- 不是教学!重要的事说一遍!我是PHP和MySQL 的初学者,我本身是个前端,为了面向工资编程,拓宽知识面才学的。
- 其实还是有一些私心得,因为都说教学相长 和 小黄鸭调试法,我这个是小老虎学习法,对着小老虎讲知识点,保证自己学的扎实,能挣钱。
- 欢迎探讨和指教,须知一山更比一山高,但是拒绝杠精!
本章主要是介绍了:
- 关系数据库的概念和术语
- Web数据库的设计与架构
基础知识还是要有的,方便了解一些专有名词,包括数据库是干啥的,后端说的时候你听了至少不懵逼。开始吧!
8.1关系数据库的概念
下方带灰色底的文字的都是摘录的书中原文!可放心阅读,以后不再说明。
当前使用关系数据库的时候,并不需要了解关系理论(这是一件好事),但还是需要理解一些关于数据库的基本概念。
8.1.1表格
一个表格就是一个数据的表格,就和Excel表格一样,储存着数据,就是下面这样,里面内容不用管,就是让你看下形式。(一般就叫表)
books
+---------------+-------------------+-------------------------------------+-------+
| id | author | title | price |
+---------------+-------------------+-------------------------------------+-------+
| 0-672-31697-8 | Michael Morgan | Java 开发 | 38.49 |
| 0-672-31745-1 | Thomas Down | Linux 开发 | 27.49 |
| 0-672-31509-2 | Pruitt,et al. | 时间管理 | 27.49 |
| 0-672-31769-9 | Thomas Schenk | 开放系统管理 | 54.99 |
| 0-672-31000-1 | 李重楼 | web开发笔记 | 99.99 |
| 0-672-31000-4 | Nicholas C.Zakas | JavaScript高级程序设计(第3版) | 99.99 |
| 0-672-31000-5 | 李重楼 | web插入数据库 | 53.20 |
| 0-672-31000-6 | 李重楼 | 网站建设与拆毁 | 44.36 |
+---------------+-------------------+-------------------------------------+-------+
表名叫books,有id,author,title,price 四个数据列。每个列里对应的是相同的数据类型,每一行对应着是一条由id,author,title,price对应的值构成的数据。
如:0-672-31000-1,李重楼, web开发笔记, 99.99 。这个就是一条数据好理解吧?
注意:竖着的叫列,横着的叫行。
8.1.2列
表中的每一列都有唯一的名称,包含不同的数据。此外每一列都有一个相关的数据类型。(注意:竖着的叫列,横着的叫行。)
如上方表格所示,author 列的数据类型就是字符串类型。这个也很好理解吧?具体都有多少数据类型,在后面有介绍,别急,慢慢看。
重点来了!!!
有时候,列也叫做 域 或者 属性!
为啥这是重点?
因为以后开发的时候怎么叫的都有,人家说 列 你脑子里知道是啥,竖着的那竖行叫列,人家说 域 或者说 属性 你就不知道是啥了那可不行,招人笑话!
也有叫字段的,但是这个一般指 列名字段,比如上面写的:id,author,title,price 这些。
8.1.3行
表中的每一行代表一个客户。每一行具有相同的格式,因而也具有相同的属性。行也称为记录。
我上面的表格示例表示每一行代表一本书。
具有相同格式是说:第二行的格式和第三行的格式一定相同,好理解吧?其实所有行格式都相同。
重点来了!!!
行也称为记录。
为啥这是重点?道理刚才说过了。不说了。
8.1.4值
每一行由对应于每一列的单个值组成,每个值必须与改了定义的数据类型相同。
这个如果不理解的话,你私信我,我单独给你解释。
8.1.5键
书里的介绍你先看。
看完了吗?没看完不要看下面的笔记。看不下去也要看,读,一句话一句话的读。读完整个8.1.5。
书读百遍其义自见是有道理的,我也笨,你以为我比你聪明?我有老师教?不!俺没有,俺读了三遍,认真的读了三遍,我就明白了。
有时候你不是学不会,是不认真学,不认真理解,听我的,感觉一遍没明白,就再读一遍。仔细的读。读出声的那种。
看完继续!
书里整段介绍的提炼的就是一句话:键,每一条数据所对应的唯一的标识。
书中举例说明的是人名,人名不唯一啊!
你回想一下,你,有个朋友说:我认识一个人叫小明。你说:哎呀,巧了,我也认识一个叫小明的。
结果一对,他说的是个女的,你说的是个男的,或者你说的是东北的小明。他说的是台湾的小明。根本不是一个人。
这就书中举名字例子要表达的,所以我们需要一系列信息来区分开两个小明或者确定其中一个你认识的小明,比如:性别,户籍所在地,出生年月,外加其他的体态外表特征等。
现实生活中:你的身份证号,就是这些信息综合抽象而成的,就是在这个“社会数据库”中,人口表中的 键,确认你身份的唯一ID。(ID 是identity的缩写,意思为身份)
这么一想,是不是感觉你家的户口本其实就很像表?户口本来有叔叔,阿姨和你,然后户口表中唯一确定你家三口谁是谁的最快最便捷的身份标识是不是身份证号?
来,再记一遍:键,每一条数据所对应的唯一的标识。
表中的标识列称为 键 或 主键。
这是书中说的,书里说的对,标识列 称为 键 或 主键,和你说的有冲突啊?!
不冲突的。
说表的主键是什么的时候?
请看上方的books表,上方books表里的id列就是表的主键。
为啥id就是主键别的不可以吗?
没有为啥!!因为我在写这个表的时候,就遵循的id字段这一列,就是唯一的标识数据,用来做主键的。
那你说的,键,每一条数据所对应的唯一的标识。是什么意思?
举例:你找作者叫李重楼的,书名为《网站建设与拆毁 》,44.36一本的书。
这个是不是一条数据?
他的id是 0-672-31000-6 ,这个 0-672-31000-6 就是这一条数据所对应的唯一的标识。
再跟我读一遍:键,每一条数据所对应的唯一的标识。嗯呢,乖~
通常,数据库由多个表组成,可以使用键作为表格之间的引用。
这种关系用关系数据库术语来描述的时候就是外键。
这个出现在别的表中的键,叫外键。
这个看书吧,我觉得很简单,我实在懒得画图了。
8.1.6模式
数据库整套表格的完整设计成为数据库的模式。
以书中列子来说:Customers(CustomerID,Name,Address,City),这个就是文本格式表示,有的人会手画表示,怎么都可以,你整明白了就行。我就对这个文本格式的模式进行一下解释吧。
- Customers:表的名称,你家的户口本,户口本三个字就是表名。
- CustomerID,Name,Address,City 都是表格的列。
- CustomerID 带下划线的是的是表示该列是主键。
- CustomerID
- CustomerID
8.1.7关系
这里还是比较复杂难理解,至少我是这么觉得。
所以,如果你觉得很简单,恭喜你,你是个天才啊~,但是你也觉得难,那么表示确实正常,不要气馁,老规矩,先读三遍。
读完了?
我开始照抄书了啊~
关系数据库中有3种基本的数据关系类型。根据关系双方所含对象的多少,可以将这些关系分为 一对一,一对多,多对多3种关系。
定义下了,有三种关系。那么开始理解。
一对一关系表示关系双方只有一个对象相互对应。
一对一是好理解的,定义都说了,你只能有一个对象,你对象也只能有一个男/女朋友,而这个男/女朋友得是你。
有一个人好几个对象的啊?那就是下一步说的了:
在一对多的关系中,一个表中的一行与另一个表中的多行具有相互关联的关系。
这个叫一对多,但是这个不举男女恋爱的例子了,因为太扎心,咱讲父与子的关系。
一个人可以生多个孩子,这些孩子都管这个人叫爹,这个爹就是“一行”,这些孩子就是“多行”,他们的关系是父子关系,如果换成顾客买东西那就是一个顾客可以购买n多件商品他们是购买关系(姑且这么叫吧)。
在多对多的关系中,表中的多行与另一个表中的多行具有相互关联的关系。
这个叫多对多,其实我一开始看的时候在想,什么情况下会出现多对多呢?
现实生活中有什么实际例子能帮我理解消化一下吗?
我就搜啊搜,看看有啥实际应用的列子吗?然后我搜到一个很贴近每个人生活,很好的例子:数据表对应关系(一对一、一对多、多对多)。
作者是:Abeam,他个人描述深深的刺激了我,描述是:编程大忌,懒~~~
因为我就懒....
扯远了。
多对多,在数据库中也比较常见,可以理解为是一对多和多对一的组合。要实现多对多,一般都需要有一张中间表(也叫关联表),将两张表进行关联,形成多对多的形式。例如: 老师表、班级表、科目表,中间表为:课程表。
例子很详细了,A老师教一二班语文,B老师教一二班数学。你思考一下,教师是个表,表里有AB两位老师,班级是个表,有一二两班。
班级表中一班对应两位老师,A和B。教师表中A对应着两个班,一班和二班。这个就是多对多,不知道你理解没有。
暂时没有理解也没关系,在后续有实际的应用,会帮助你理解的。
我不得不献上我的画作了
自己看图理解吧。
8.2 设计Web数据库
本章主要是介绍了:
- 关系数据库的概念和术语
- Web数据库的设计与架构
基础知识还是要有的,方便了解一些专有名词,包括数据库是干啥的,后端说的时候你听了至少不懵逼。开始吧!
书中是以 Book-O-Rama(拉玛的书店?)的内容为例的,我也尽量吧。
customers
+------------+-----------------+--------------------+--------------------+
| customerid | name | address | city |
+------------+-----------------+--------------------+--------------------+
| 1 | 刘能 | 牡丹江大街 | 牡丹江 |
| 2 | 李重楼 | 北京中弘像素 | 北京 |
| 3 | 谢广坤 | 保定市 | 保定 |
| 4 | Alan Wong | 1/47 Haines Avenue | 保定 |
| 5 | Michelle Arthur | 357 North Road | Yarraville |
| 6 | Melissa Jones | 红庄 c3-1 | Nar Nar Goon North |
+------------+-----------------+--------------------+--------------------+
order
+---------+------------+--------+------------+
| orderid | customerid | amount | date |
+---------+------------+--------+------------+
| 1 | 3 | 69.98 | 2018-06-27 |
| 2 | 1 | 49.99 | 2018-06-26 |
| 3 | 2 | 74.98 | 2018-06-25 |
| 4 | 3 | 24.99 | 2018-06-24 |
+---------+------------+--------+------------+
books
+---------------+-------------------+-------------------------------------+-------+
| isbn | author | title | price |
+---------------+-------------------+-------------------------------------+-------+
| 0-672-31697-8 | Michael Morgan | Java 开发 | 38.49 |
| 0-672-31745-1 | Thomas Down | Linux 开发 | 27.49 |
| 0-672-31509-2 | Pruitt,et al. | 时间管理 | 27.49 |
| 0-672-31769-9 | Thomas Schenk | 开放系统管理 | 54.99 |
| 0-672-31000-1 | 李重楼 | web开发笔记 | 99.99 |
| 0-672-31000-4 | Nicholas C.Zakas | JavaScript高级程序设计(第3版) | 99.99 |
| 0-672-31000-5 | 李重楼 | web插入数据库 | 53.20 |
| 0-672-31000-6 | 李重楼 | 网站建设与拆毁 | 44.36 |
+---------------+-------------------+-------------------------------------+-------+
这是我写的测试数据,后续你写的时候也可以添加一些自己的数据,很有意思的。目前先看书就可以。
8.2.1考虑要建模的实际对象
当创建一个数据库时,我们经常为现实世界的实体和关系建立模型,并且储存这些实体对象与关系的信息。
书中这句话就涵盖了标题的意思。
这一节也没啥好说的,你保证能理解数据库表,列,行,字段,值,这些概念,看的懂书中给出图例的键,外键就可以。
也别着急实际操作,切勿操之过急。毕竟古人云:捷克,斯洛伐克 嘛。
8.2.2避免保存冗余数据
来,跟我读:避免保存冗(rǒng )余数据。(多余的重复或啰嗦内容(包括信息、语言、代码、结构、服务、软件、硬件等等)均称为冗余)
别笑,我之前默念了好几年的“沉余”,不会,读错不丢人,丢人的是 不会,还不学。再读一遍“ 冗(rǒng )余”。
这一节开篇没啥说的做了一下自问自答,你先看吧。
看完咱们来画重点。
重点来了!!!
三个"不规则"
1.修改不规则
书中举了Juile在下了订单后搬家了,需要在三个地方更新她的地址,进行三次同样的操作。
这很容易使我们在一个地方修改数据,从而导致数据库中的数据不一致,因为问题发生在修改数据库的时候所以称为“修改不规则”。
2.插入不规则
每次必须检查Juile的数据(地址)是否与表中当前行一致,如果不检查,可能会有两行关于Juile相互冲突的数据,比如一条数据告诉我们Juile住二环,另一条则可能表命明她住南四环。
因为出现在插入数据的时候,所以称之为“插入不规则”。
3.删除不规则
如果订单交货,需要将Juile的订单信息从数据库删除,也意味着她的地址没有了。她下次再订货,还要单独的提交一遍地址。
因为从数据库中删除一行的时候发生的,所以称之为“删除不规则”。(这点尤为重要,在电商公司拼命的获取用户隐私,地址这么重要的数据,你在用户收到快递就给删了?!这么设计表你能被老大打死!)
通常,数据库的设计不应该出现上述不规则中的任何一种。
书里说的很含蓄,“通常”不这么干。我给你翻译翻译就是:除了DEMO 和入门学习!别鸡儿这么干!(你们技术老大,或者负责人让你这么干!你让他写下来签字!)
这里主要是介绍一些数据库设计的基本原则,业界通用的,所以别烦躁,好好看,万丈高楼平地起,辉煌还得靠自己!
8.2.3使用原子列值
你看到这的时候,我默认你是看完8.2.3这一节了。
有哪不懂的吗?
没有?
太好了!
我有!
使用原子列值得意思是对每一行的每个属性只储存一个数据。
你给我解释一下这句话,或者你脑子过一下,这句话什么意思。
如果你能毫不费劲的答出这句话什么意思,我觉得你不应该看我的笔记,因为我觉得没必要。
如果你一带而过,没有深入思考过这句话,或者我问了你,你解释不上来,那么,不要难过,为啥呃?
因为我第一遍,还没写笔记看的时候,也是一带而过,因为我觉得木有用,不用深入看,不影响我搞后面的内容。
但是!
是谁说的来着?但是之前的话毫无意义!
我要写笔记给你看的时候,我被这句卡住了!我解释不上来!
我百度,我谷歌这句话,基本上全是照着书抄!根本没解释这句话!
经过我不懈的翻书以及修改关键词,我搜到了!
原文章见此处:一个小时学会MySQL数据库 ,我截取文章见此处:数据库规范化。
原文中对MySQL数据库有概要介绍,包括数据库的历史。大致阅读时间半个小时。
而我呢,截取其中 1.4 部分,用来解释上面那句话!
所谓第一范式(1NF)是指在关系模型中,对列添加的一个规范要求,所有的列都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
即实体中的某个属性有多个值时,必须拆分为不同的属性。
在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。
简而言之,第一范式就是无重复的域。
这是其中第一范式的解释,其中说:原子性,即实体中的某个属性有多个值时,必须拆分为不同的属性。对“使用原子列值得意思是对每一行的每个属性只储存一个数据”。进行了解释。
如果不懂去看原文,我都能看懂,你应该也行。还是不懂,私信我。咱俩一起学习!
补充一下:推荐看原文,别嫌弃麻烦!至少我截取的部分 数据库规范化 要看,多看几遍,不累的。
所以说,写阅读笔记出来,对自己也是一种提高,逼着自己仔细看书,学的扎实~
8.2.4 选择有意义的键
答案:略。
8.2.5考虑需要询问数据库的问题
答案:略。
8.2.6 避免多个空属性的设计
答案:略。
8.2.7避免多个空属性的设计
答案:略。
上面的 “答案:略” 是不是在初高中参考书里经常见啊?
我是经常见,很烦人,但是那两节我真的没有要记得,所以略就略吧。
这三节主要是联系上下文,传达基础理论知识的。多看几遍没坏处,我觉得没必要是因为我记脑子里了~啦啦啦啦
8.3 Web数据库架构
书里的图8-9
一个典型的Web数据库事务包含下列步骤,这些步骤在图8-9已经标出。以Book-O-Rama书店为例,我们逐个解释这些步骤。
1)用户的Web浏览器发出HTTP请求,请求特定Web页面。例如,该用户可能以HTML表单的形式,要求搜索Book-O-Rama书店里所有由Laura Thomson编写的图书。搜索结果网页称为results.php。
2)Web服务器收到results.php的请求,获取该文件,并将它传到PHP引擎,要求它处理。
3)PHP引擎开始解析脚本。脚本中有一条连接数据库的命令,还有执行一个查询(执行搜索图书)的命令。PHP打开通向MySQL数据库的连接,发送适当的查询。
4)MySQL服务器接受数据库查询并处理。将结果(一个图书的列表)返回到PHP引擎。
5)PHP引擎完成脚本运行,通常,这包括将查询结果格式化成HTML格式。然后再将输出的HTML返到Web服务器。
6)Web服务器将HTML发送到浏览器。这样用户就可看到她所搜索的图书。
这个过程基本上与脚本引擎和数据库服务器无关。通常,Web服务器软件,PHP引擎和数据库服务器都在同一台机器上运行。
但是,数据库服务器在另外一台机器上运行也是非常常见的。这样做是出于保密、提高性能以及负载平衡的原因而考虑的。从开发的角度来看,要做的事情基本上是一样的,但是它能够明显提高性能。