Node之数据库设计
SQL 全称叫 Structured Query Language 结构化查询语言。是一种声明式语言,它和 js 这种命令式语言不同,可以直接表达含义,比较简单。
大多数的关系型数据库都使用这种语法。
SQL 有三个分支。
第一个分支是 DDL ,全称 Data Definition Language 数据定义语言,是用来操作数据库对象的。数据库对象就是在数据库管理工具下服务器下的一个个库,相当于是一个 excel 文件。这个文件中可以有很多的表,以及视图。
第二个是 DML ,全称为 Data Manipulation Language 数据操控语言,是用来操作数据库中的记录,记录类似于表格中的行。
第三个是 DCL ,全称 Data Control Language 数据控制语句,用来操作用户权限。可以控制用户权限。
这三个分支语法是类似的,当我们操作 navicat 时,会内部生成了 sql 语句,然后在命令行执行。
CREATE DATABASE abc;
这样就可以创建一个名为 abc 的数据库,这里不区分大小写。在进行自己命名的时候,为了和关键字进行区分,使用反引号的对象名称来表示命名。我们一般更多的是使用 DML 命令。
USE test;
切换数据库,当我们使用表的时候需要切换数据库。使用上面命令进行切换,之后的命令在后面运行。窗口的界面可能不会变化。
DROP DATABASE test;
这样可以删除数据库。
创建表的时候会弹出一行,它表示表的一列,叫做字段,也叫做属性,可以有很多属性。表的列数都是固定的。
字段里面有字段名,字段类型。字段类型就是数据类型,有 bit 表示存储 2 位的 boolen 型,有表示整数的 int 32 位,表示小数的 decimal(M,N),它不同于 float 和 double ,js 里采用的是 64 位的 double ,它表示精确的小数,M 表示总位数,N 表示小数位数。多余的会进行截断。
表示字符串的有 char(n) varchar(n) text ,char 表示存定长 n 的位数,不足会补空格,varchar 只有最大定长 n ,超过会存不下,text 表示 varchar 存不下的,通常是文章内容,里面又分很多类型。
date 只存储日期,datetime 存储日期和时间,可以到毫秒,time 只存时间。
还有是不是 null ,如果不是 null ,则必须要填。还可以设置默认值和自增。
CREATE TABLE `test2`.`student` (
`name` varchar(100) NOT NULL,
`birthday` date NOT NULL,
`sex` bit NOT NULL DEFAULT 0,
`studo` int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`studo`)
);
这里创建了一个名为 student 的新表,使用 CREATE 命令。每一行就是一条记录。
ALTER TABLE `test2`.`student`
MODIFY COLUMN `studo` int NOT NULL AUTO_INCREMENT FIRST,
ADD COLUMN `phone` varchar(11) NOT NULL AFTER `sex`;
修改表使用 ALTER 命令。
DROP TABLE `student_copy1`;
删除表使用 DROP 命令。
表里的横向的每一条记录必须具备唯一性,并且不能更改,所以也不能有业务含义,必须有单独的一列来承担这个作用,这就是主键,并且根据设计原则,原则上每一张表都必须有主键。我们一般使用 id 来创建主键这一列。
一般 id 这一列也设为自动递增。id 也可以使用字符串,uuid 来命名,使用数字是为了自动递增。uuid 是通过一些算法生成全球唯一的字符串。使用单引号来表示字符串。
并且主键在存储方式上可以加快查找,并且在设计查找方式的时候也是以主键为标准。
SELECT UUID();
可以每次都打印出不同的 uuid 的值。主键可以进行几列组合成一个主键。
外键是别的表里的主键。为了进行表与表之间的关联,需要有一列来进行关联。这一列就是这个表的外键,它记录了另一个表的主键。
当设置了一个特别的列之后,需要在这个表的外键设置中进行表的关联操作,找到要关联的父表。此时,当父表的记录与子表中有数据关联时,不删除子表的关联记录,父表中相关的记录是无法删除的。
两个表之间的关系可以通过图表的形式展示出来,点击中间展示出了外键和主键。
表关系有一对一,一对多,多对一。
一对一就是一个 A 对应一个 B ,一个 B 对应一个 A 。如果把任意一张表的主键同时设置为外键,那么主键肯定是唯一的,外键的关联就是一对一。比如用户和用户信息,它们肯定是完全一致的。
一对多就是一个 A 对应多个 B ,一个 B 对应一个 A ,A 和 B 是一对多,B 和 A 是多对一。比如班级和学生,用户和文章的关系都是这样。由于主键具有唯一性,我们在使用外键对应另一张表的主键时,如果选择一多端,会出现许多外键选择,连接主键只能连接唯一性的主键,就是一一对应关系的主键,所以只能从多一端去选择唯一对应的主键。
多对多就是一个 A 对应多个 B ,一个 B 对应多个 A 。比如老师和学生,商品和购物车。这时,在原来的表已经无法满足要求,需要单独建一张表来表示对应关系。表中通过每一条记录来进行这种一对一关系,所以肯定需要至少两个外键,用来对应到两张表。
还有设计表的三大范式:
第一,要求数据库表每一列都是不可分割的原子数据项。因为如果可以分割说明在设计的时候没有把应该包含的包含进来。
第二,非主键列必须依赖主键列。也就是不能出现一个与主键毫无关系的一列。
第三,非主键列必须直接依赖主键列。比如学生 id 里出现班级名称,但班级名称应该先属于 班级 id 然后才是学生 id ,这就导致不是直接依赖。
还有数据冗余的问题,进行不冗余。如果冗余,会好读但不好写,读起来更方便,但写的时候会重复书写。