Mysql三大范式数据库设计有关博客文章分享(mysql三大范式博客)

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三大范式的概念和实际应用,以及博客文章的数据库设计和实现代码。在实际开发中,合理的数据库设计可以提高系统的可维护性和可扩展性,也能够提高系统的性能和安全性。希望对大家有所帮助。


数据运维技术 » Mysql三大范式数据库设计有关博客文章分享(mysql三大范式博客)