前言:

本文内容:MySQL备份、如何设计一个项目的数据库、数据库三大范式

推荐免费MySQL基础讲解视频:【狂神说Java】MySQL最新教程通俗易懂哔哩哔哩bilibili

MySQL备份

为什么要备份:

  • 保证重要的数据不丢失
  • 数据转移A—>B

MySQL数据库备份的方式

  • 直接拷贝物理文件

  • 在可视化工具中手动导出

    158

  • 使用命令行备份mysqldump

    1
    2
    # mysqldump -h 主机 -u 用户名 -p 密码 数据库名 (表名1,表名2,...) > 导出路径和文件名称
    mysqldump -hlocalhost -uroot -p123456 test student >D:/student.sql

如何设计一个项目的数据库

当数据库比较复杂,需要设计数据库

糟糕的数据库设计

  • 数据沉余,浪费空间
  • 数据库插入和删除麻烦,异常(屏蔽使用物理外键)
  • 程序的性能差

良好的数据库设计

  • 结绳内存空间
  • 保证数据库的完整性
  • 方便我们开发系统

软件开发中,关于数据库的设计

  • 分析需求:分析业务和需要处理的数据库的需求
  • 概要设计:设计关系图E-R图

设计数据库的步骤:(个人博客)

  • 设计信息,需求分析
    • 用户表(用户登录注销,用户的个人信息,写博客,创建分类)
    • 分类表(文章分类,谁创建的)
    • 文章表(文章的信息)
    • 评论表(文章的评论)
    • 友链表(友链信息)
    • 自定义表(系统信息,某个关键的字,或者一些主字段等)
    • 说说表(发表心情)
  • 标识实体(把需求落地到每个字段)
  • 标识实体之间的关系
    • 写博客:user->blog
    • 创建分类user->category
    • 关注user->user
    • 友链 links
    • 评论 user-user->comment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
MySQL Backup
Database: test
Backup Time: 2022-03-19 11:54:17
*/
-- 博客对应表
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `test`.`blog`;
DROP TABLE IF EXISTS `test`.`category`;
DROP TABLE IF EXISTS `test`.`comment`;
DROP TABLE IF EXISTS `test`.`links`;
DROP TABLE IF EXISTS `test`.`user`;
DROP TABLE IF EXISTS `test`.`user_follow`;
CREATE TABLE `blog` (
`id` int NOT NULL COMMENT '文章id',
`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文章标题',
`author_id` int NOT NULL COMMENT '作者id',
`category_id` int NOT NULL COMMENT '分类id',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文章内容',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
`love` int DEFAULT NULL COMMENT '点赞',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `category` (
`id` int NOT NULL COMMENT '分类id',
`category_name` varchar(30) NOT NULL COMMENT '分类名称',
`create_user_id` int DEFAULT NULL COMMENT '创建分类的用户id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `comment` (
`id` int NOT NULL COMMENT '评论id',
`blog_id` int NOT NULL COMMENT '博客id',
`user_id` int NOT NULL COMMENT '用户id',
`content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '评论内容',
`create_time` datetime NOT NULL COMMENT '创建时间',
`user_id_parent` int NOT NULL COMMENT '回复人的id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `links` (
`id` int NOT NULL COMMENT '友链id',
`links` varchar(50) NOT NULL COMMENT '网站名称',
`href` varchar(2000) NOT NULL COMMENT '网站链接',
`sort` int NOT NULL COMMENT '排序',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `user` (
`id` int NOT NULL COMMENT '用户id',
`username` varchar(60) NOT NULL COMMENT '用户名',
`password` varchar(60) NOT NULL COMMENT '用户密码',
`sex` varchar(2) NOT NULL COMMENT '性别',
`age` int DEFAULT NULL COMMENT '年龄',
`sign` varchar(255) DEFAULT NULL COMMENT '签名',
`open_id` varchar(1000) NOT NULL COMMENT '微信id',
`avatar` varchar(1000) NOT NULL COMMENT '头像地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `user_follow` (
`id` int NOT NULL COMMENT '关注表id',
`user_id` int NOT NULL COMMENT '被关注的id',
`follow_id` int NOT NULL COMMENT '关注人的id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
BEGIN;
LOCK TABLES `test`.`blog` WRITE;
DELETE FROM `test`.`blog`;
UNLOCK TABLES;
COMMIT;
BEGIN;
LOCK TABLES `test`.`category` WRITE;
DELETE FROM `test`.`category`;
UNLOCK TABLES;
COMMIT;
BEGIN;
LOCK TABLES `test`.`comment` WRITE;
DELETE FROM `test`.`comment`;
UNLOCK TABLES;
COMMIT;
BEGIN;
LOCK TABLES `test`.`links` WRITE;
DELETE FROM `test`.`links`;
UNLOCK TABLES;
COMMIT;
BEGIN;
LOCK TABLES `test`.`user` WRITE;
DELETE FROM `test`.`user`;
UNLOCK TABLES;
COMMIT;
BEGIN;
LOCK TABLES `test`.`user_follow` WRITE;
DELETE FROM `test`.`user_follow`;
UNLOCK TABLES;
COMMIT;

数据库三大范式

为什么需要数据规范化?

  • 信息重复
  • 更新异常
  • 插入异常
    • 信息插入失败等
  • 删除异常
    • 有效信息丢失等

数据库三大范式

第一范式(1NF)

  • 要求数据库表的每一列都是不可分割的原子数据项;

第二范式(2NF)

  • 前提:满足第一范式;

  • 确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关;

第三范式(3NF)

  • 前提:满足第二范式;

  • 确保数据表中的每一列数据都和主键直接相关,而不能间接相关;

规范性和性能的问题

  • 考虑商业化的需求和目标(成本:用户体验)数据库的性能更加重要;
  • 在规范性能问题的时候,需要适当考虑规范性;
  • 故意给某些表增加一些冗余的字段(多表变为单表);
  • 故意增加一些计算列(大数据量降低为小数据量的查询:索引);