Node.js:数据库基本知识

195 阅读2分钟

关系型数据库的范式(设计标准)

第一范式 1NF

image.png

image.png

第二范式 2NF

定义

  • 在1NF的基础上,要有键(键可由多个字段组合)

  • 所有字段分别完全依赖于键

  • 如果键是多个字段组合,则不允许部分依赖于该键

依赖关系

  • 给出键,就能唯一确定字段的值

  • 如给出学号,就能唯一确定的姓名,反之则不行

  • 则称姓名依赖于学号

不满足第二范式的地方

  • 上表的键为(学号,课名)

  • 但存在部分依赖:姓名依赖于学号

image.png

第三范式3FN

定义(不标准)

  • 一个表里不能有两层依赖

  • 给出学号,就能确定系名:系名依赖于学号

  • 给出系名,就能确定系主任:系主任依赖于系名

  • 所以,系主任间接依赖于学号

解决办法

  • 把系名和系主任单独建表

image.png

image.png

数据库设计经验

高内聚

  • 把相关的字段放在一起,不相关的分开建表

  • 如果两个字段能够单独建表,那就单独建表

低耦合

  • 如果两个表之间有弱关系

  • 一对一可放在一个表,也可两个表加外键

  • 一对多一般用外键

  • 多对多一般建中间表

image.png

image.png

image.png

image.png

JOIN

链接表

  • inner join

  • left join

  • right join

  • full outer join

image.png

参考文章

语法

把报名改为T1{[INNER]|{LEFT|RIGHT}FULL}[OUTER]}JOIN T2 ON boolean_expression

image.png

启动 mysql
docker container start mysql1 
或者
docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.28
进入 mysql
docker exec -it mysql1 bash
mysql -u root -p
输入密码 123456


创建数据库
CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
show databases;
use db1;
创建表
create table users(id serial, name text);
create table staffs(id serial, name text);
create table orders(id serial, user_id bigint unsigned, staff_id bigint unsigned, amount int unsigned);

创建记录
insert into users (name) values ('XiaoMing');
insert into staffs (name) values ('XiaoHong');
insert into orders(user_id,staff_id, amount) values (1,1, 100);
使用 inner join
select users.name as uname, orders.amount as amount from users inner join orders on users.id =orders.user_id;
得到 XiaoMing 100


start transaction;
语句1;  语句2; 语句3;
commit;

其他join

Left join

  • 会保留右边的null,以保证左边都显示

Right join

  • 会保留左边的null,以保证右边都显示

Full outer join

  • 保留两边的null,以保证两边都显示

缓存字段&事务&MySQL存储引擎

image.png

image.png

image.png

image.png