Mysql三大范式:数据库设计有关博客文章分享
在数据库设计中,范式是一个非常重要的概念。范式定义了关系数据库表的规范化程度,常用的有三大范式(1NF,2NF和3NF)。本文将深入介绍Mysql三大范式的概念和实际应用,并结合现实案例分享博客文章的数据库设计。
一、第一范式(1NF)
第一范式最基本的要求是数据表中的每一列都是原子性的,也就是说每个字段不能再分成更小的数据单元。如下表所示,每个字段都是原子性的,符合1NF的要求:
| id | title | author | content | date |
|—-|———–|——–|———|————|
| 1 | Hello | Tom | Hello | 2021-01-01 |
| 2 | World | Jerry | World | 2021-01-02 |
| 3 | MySQL | Tom | MySQL | 2021-01-03 |
二、第二范式(2NF)
第二范式的要求是数据表中的非主键字段都必须完全依赖于主键,即非主键字段不能部分依赖于主键。例如:
| id | title | author | content | date | category |
|—-|———–|——–|———|————|——– |
| 1 | Hello | Tom | Hello | 2021-01-01 | IT |
| 2 | World | Jerry | World | 2021-01-02 | IT |
| 3 | MySQL | Tom | MySQL | 2021-01-03 | Database |
上述表格中,category字段并不完全依赖于id字段,而是与其他主键字段title、author、content、date相关,因此可以将category字段分离出来成为一个新的表:
| category_name | article_id |
|—————|———–|
| IT | 1 |
| IT | 2 |
| Database | 3 |
这样,就符合2NF的要求。
三、第三范式(3NF)
第三范式的要求是数据表中的非主键字段必须直接依赖于主键,即非主键字段不能传递依赖于主键。例如:
| id | title | author_name | author_eml |
|—-|———–|————-|—————-|
| 1 | Hello | Tom | tom@example.com |
| 2 | World | Jerry | jerry@example.com |
| 3 | MySQL | Tom | tom@example.com |
上述表格中,author_name和author_eml字段都依赖于主键id,但author_eml字段又依赖于author_name字段,违反了3NF的要求。因此可以将表格拆分为作者信息表和文章表:
| author_id | author_name | author_eml |
|———–|————-|—————-|
| 1 | Tom | tom@example.com |
| 2 | Jerry | jerry@example.com |
| article_id | title | author_id |
|————|———–|———–|
| 1 | Hello | 1 |
| 2 | World | 2 |
| 3 | MySQL | 1 |
四、博客文章的数据库设计
在设计博客文章的数据库时,可以参考以下设计:
1.文章表(article):
| id | title | content | created_at | updated_at | user_id |
|————-|————–|————-|—————|—————|———–|
| INT(11) | VARCHAR(255) | TEXT | TIMESTAMP | TIMESTAMP | INT(11) |
字段说明:
id:唯一ID,主键
title:文章标题
content:文章内容
created_at:创建时间
updated_at:最后更新时间
user_id:作者ID,外键
2.用户表(users):
| id | name | eml | password |
|————-|—————|—————-|————–|
| INT(11) | VARCHAR(255) | VARCHAR(255) | VARCHAR(255) |
字段说明:
id:唯一ID,主键
name:昵称
eml:邮箱地址
password:密码
3.分类表(categories):
| id | name |
|————-|————-|
| INT(11) | VARCHAR(255) |
字段说明:
id:唯一ID,主键
name:分类名称
4.文章分类关系表(article_category):
| article_id | category_id |
|————-|—————|
| INT(11) | INT(11) |
字段说明:
article_id:文章ID,外键
category_id:分类ID,外键
实现代码:
1.创建文章表
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT ”,
`content` text NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRNT `article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.创建用户表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT ”,
`eml` varchar(255) NOT NULL DEFAULT ”,
`password` varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.创建分类表
CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.创建文章分类关系表
CREATE TABLE `article_category` (
`article_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
PRIMARY KEY (`article_id`,`category_id`),
KEY `category_id` (`category_id`),
CONSTRNT `article_category_ibfk_1` FOREIGN KEY (`article_id`) REFERENCES `article` (`id`) ON DELETE CASCADE,
CONSTRNT `article_category_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以上是Mysql三大范式的概念和实际应用,以及博客文章的数据库设计和实现代码。在实际开发中,合理的数据库设计可以提高系统的可维护性和可扩展性,也能够提高系统的性能和安全性。希望对大家有所帮助。