数据库:
1.分类(按照最主要特征去分类)
1)文件型数据库(就是一个文件,可以很方便的拷贝) 不适合存储大量的数据。适合单机存储少量数据。
access、sqlite(对系统占用空间极小)
2)关系型数据库:强调数据之间是有关系,功能很强大,但性能会下降。
mysql、Oracle
3)分布式数据库:可以把数据库安装在各个机器上,安全性是比较高的,一般会做备份,一般会备三份,如果全丢的可能性不太大,这时候如果任何一台机器死了,数据没法恢复,你再放一台新的机器上去,他会自动的把数据同步过去。
特点:单机的性能不一定好,但是可以通过堆积器来堆堆堆,最后总体的性能吞吐量非常的高
mongoDB
4)NoSQL:砍掉了复杂的查询,无法支持复杂的查询,不用那么多的功能,但是性能高,一般系统的性能高低都在数据库这。支持高并发。
memcache、redis
一个项目中可以根据需要,使用不同的数据库。比如:客户端用sqlite用来缓存一些数据(包括提交失败的,包括用户断网的),置于后台,用Oracle或者mysql。还可以用redis当外壳,因为数据不可能都每次找mysql要(对mysql的压力很大),是用redis当缓存(存储最近一段时间的数据,热门数据等),这样就降低了主数据库mysql的负载。
如果比较简单的项目,就使用一种数据库就行了,比如mysql。
2.安全性
注入攻击
3.操作
管理型
增删改查
管理工具:可视化操作数据库
navicat
类型:
数字:int
文本: varchar -> 短的字符串
text -> 大量字符串
索引的作用:
1.性能
1)主键 : = 唯一 + 索引
2)唯一 :Unique(不重复)
3)索引:提高查询性能,但降低其他操作(新增和删除)的性能,更占空间
4)全文索引:适合文本搜索
主键 = 唯一 + 索引
2.限制和约束
node操作数据库:
通常情况下,数据库和web前端机(不是指浏览器,说的是对用户直接提供访问的服务器),一般情况下,web前端机和数据库一定不是在一台机器上,为什么?
1)因为web前端机的风险更高,他会直接接受用户的访问,所以不会把数据库放在他上面去,否则很容易把数据库暴露出去
2)一般情况下,web前端机很多,把数据库部署上去会涉及到分布式的各种事。
3)前端主机的资源消耗比较大(要做缓存,磁盘内存都比较忙)数据库放在前端机上性能会低
所以一般情况下,nodeJs和数据库之间都是通过网络来交换数据,因为他们不在一台主机上面。
nodejs操作数据库也是异步的
如果也是异步的,我们操作数据库的时候得想办法变成promise认识的状态,变成同步化。
node 安装数据库:
1) npm init -y -> 初始化
2)npm i mysql -D ; -> 安装 (这个安装的是mysql库的版本,而不是mysql服务器的版本)
node连接mysql的必要条件:
1.需要电脑上有mysql服务器(可以单独下载mysql,也可以用phpstudy,phpstudy中自带的有mysql)
2.npm 安装mysql的库,用于引入mysql模块,连接mysql数据库
3.可以用navicat数据库工具查看数据库(一般创建数据库,都用他,基本不在node中创建数据库,太麻烦)
添加成功data会出现一个这样的信息: 一般里面的insertID最常用,返回给前端。
接下来,我们要做一个前端填写用户名密码登录注册,后端收到数据进行校验,校验成功后存储到数据库:
前端:ajax发送数据,默认get方式
后端:判断存储
前端提交:
数据库:存储到了xiaohong 这条数据
综上:我们其实有两个问题需要解决
问题1) 当同时连接数过多时,只有一个连接,一个卡住,其他都跟着等着,性能不好。
我们使用了一个叫做createConnection来跟服务器建立连接
问题2)操作数据库中全都是用回调函数,虽然可行,node中操作数据库的机制也是这样的,但是太麻烦了,尤其是复杂操作
解决办法:co-mysql ,他是另外一个模块,这个模块没有办法独立的来使用,他实际上不是一个mysql,他实际上是一个mysql的一个封装,可以把普通连接封装成可以做异步调用的连接。
使用要先安装: npm i co-mysql -D ;
引入:const co=require('co-mysql');
使用:把原来的连完的连接包裹一下;
因为用了async和await 我们用try catch包裹,捕获错误信息。
综上:对于用户名和密码的校验注册和登录都要用到,所以我们要把他提出去,引入进来。
最后思考:
为什么node和mysql建立连接的时候,也就是

所以我们要通过co-mysql,使原来的db包装成promise对象,这样就可以使用async和await了,这样写就更扁平化,让人利于理解和维护。