Node.js操作Mysql数据库

740 阅读3分钟

数据库Database

将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合成为数据库.
根据保存的格式的不同,数据库一般被分为:
关系型数据库-使用最广泛的数据了
面向对象数据库、XML数据库、兼职存储系统、层次数据库

数据库管理系统DBMS

用来管理数据的系统称为数据库管理系统
如MySQL、PostgreSQL、SQLSever、DB2、Oracle

DBMS的结构

DBMS的结构 我们使用的mysql命令,就是一个客户端,而mysql背后还有一个server在24小时不间断运行着

安装数据库

个人用的是windows安装的是旧版(其它系统可自行网上搜索对应的安装方式)
下载Docker Toolbox
点击开始运行Docker Quickstart Terminal
docker run hello-world检验是否安装成功 安装成功 安装mysql

docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.28
docker ps //用于查看container的运行状态
docker exec -it mysql1 bash//用bash 执行mysql1
mysql -u root -p//使用root权限登录

连接数据库

增删改查

postgresql文档

CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;//创建数据库
create table users(id serial,name text);//创建表
show databases;//查看所有的数据库
use dataName;//使用dataName数据库
show tables;//查看所有表
select * from user;//查看user表的全部内容
describe user;//查看user的描述字段
insert into user(name,age) values('alsan',18)//插入数据
delete from user where name = 'gouzi';//删除名为gouzi的数据
update user set age=70 where name='aslan';//将名字为aslan的年龄更新,如果不写name会将数据库全部内容更改
alter table user add id serial;//添加自增长的id(序列号);

mysql数据类型

数字、字符串、时间日期、JSON、其他特殊类型 官方文档

ORM

var mysql = require('mysql');
var connection = mysql.createConnection({
    host: '192.168.99.100',
    user: 'root',
    password: '123456'
});

connection.connect();

connection.query('CREATE DATABASE IF NOT EXISTS aslan DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_520_ci;', function (error, results, fields) {
    if (error) throw error;
    console.log('The solution is: ', results);
});
connection.query('use aslan')
connection.query(`CREATE TABLE IF NOT EXISTS user(
    name text,
    age int
)`);

关系型数据库的范式

第一范式1nf
定义:字段不可再分
第二范式2nf
在1nf的基础上,要有键,所有字段分别完全依赖于键,如果键是多个字段,则不允许部分依赖于该键
依赖关系
给出键,就能确定唯一字段的值
不足的地方
但存在部分依赖 第三范式3nf
一个表不能有两层依赖,给出学号就能确定系名:系名依赖学号
给出系名,就能确定系主任:系主任依赖于系名,所以系主任简介依赖于学号
解决办法
把系名和系主任单独建表

数据库设计经验

高内聚
把相关的字段放到一起,不相关的分开建表
如果两个字段能够单独建表,那就单独建表
低耦合
如果两个表之间有弱关系
一对一可放在一个表,也可以两个表外加键
一对多一般用外键
多对多一般建中间表

JOIN(连接表)

select users.name,orders.amount from users inner join orders on users.id = orders.user_id;//将users表中的name 和orders表中的amount通过users.id/orders.user_id连接起来;

select users.name as uname,orders.amount as oamount from users inner join orders on users.id=orders.user_id;//连接两个表并且重命名

inner join 多的数据都不要
left join 左边多出的数据留着
right join 右边多出的数据留着
full outer join 多出的数据都留着

缓存字段

假设一个博客blog包括多个评论comments
如何获得博客的评论数
select count(id)from comments where blog_id=8
这样太慢了,可以在blog表上加一个comment_count字段
每次添加comment则+1,每次删除comment则-1

事务

用户评论之后,要做两件事情,1.在comments表增加记录,2.在blogs表将对应的comment_count+1,如果第一步执行了,第二步没有执行,数据就乱了
所以我们要用到事务

create index index1 on users(name);//创建唯一索引