数据库Database
将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合成为数据库.
根据保存的格式的不同,数据库一般被分为:
关系型数据库-使用最广泛的数据了
面向对象数据库、XML数据库、兼职存储系统、层次数据库
数据库管理系统DBMS
用来管理数据的系统称为数据库管理系统
如MySQL、PostgreSQL、SQLSever、DB2、Oracle
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权限登录
连接数据库
增删改查
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);//创建唯一索引