JavaWeb博客系统后端-数据表设计

# JavaWeb博客系统后端-系列

JavaWeb博客系统后端-功能需求 (opens new window)

JavaWeb博客系统后端-项目创建 (opens new window)

JavaWeb博客系统后端-封装返回结果 (opens new window)

JavaWeb博客系统后端-重构ResponseResult (opens new window)

# 数据库的选择

选择数据库要考虑

  • 是否收费
  • 性能(时间和空间维度)
  • 场景
  • 技术掌握程度

其实呀,选择有两种情况

  • 第一种是你去公司上班,别人掌权,由CTO选择。公司已经用什么数据库了就用什么数据库
  • 第二种是你会什么选择什么

你自己选择也没关系,前期还是自己会什么使用什么吧。

目前主要流行的有Mysql,有Mongodb,Oracle

  • Oracle 比较适合超大型的系统,也收费
  • Mysql,免费。现在很多公司都去O化,也就是不用Oracle了。
  • Mongodb,企业版收费,社区版本免费,详情请查看MongoDB Licensing (opens new window)

所以,大多数情况下我们选择Mysql或者Mongodb

这里的话我们就选择MySql数据库

# 表和字段设计

  • 用户表tb_user
    • id-ID
    • user_name-用户名
    • password-密码
    • roles-角色
    • avatar-头像
    • email-邮箱
    • sign-签名
    • state-状态
    • reg_ip-注册ip
    • login_ip-登录ip
    • create_time-创建时间
    • update_time-更新时间
  • 文章表tb_article
    • id-ID
    • title-标题
    • user_id-用户ID
    • user_avatar-用户头像
    • user_name-用户名
    • category_id分类ID
    • content-内容
    • type-类型(0表示富文本,1表示markdown)
    • state-状态(0表示已发布,1表示草稿,2表示删除)
    • summary-摘要
    • labels-标签
    • view_count-浏览量
    • create_time-发布时间
    • update_time-更新时间
  • 文章分类表tb_categories、
    • id-ID
    • name-分类名称
    • pinyin-名称拼音
    • description-分类描述
    • order-顺序
    • status-状态
    • create_time-创建时间
    • update_time-更新时间
  • 评论表tb_comment
    • id-ID
    • parent_content-被评论内容-子评论
    • article_id-文章ID
    • content-评论内容
    • user_id-评论人用户ID
    • user_avatar-评论人头像
    • user_name-评论人名称
    • state-状态(0表示删除,1表示正常)
    • create_time-创建时间
    • update_time-更新时间
  • 图片表tb_images
    • id-ID
    • user_id-用户ID
    • url-路径
    • state-状态(0表示删除,1表正常)
    • create_time-创建时间
    • update_time-更新时间
  • 标签统计表tb_labels
    • id-ID
    • name-标签名称
    • count-数量
    • create_time创建时间
    • update_time更新时间
  • 轮播图表tb_looper
    • id-ID
    • title-轮播图标题
    • order-顺序
    • state-状态
    • target_url-目标链接
    • image_url-图片路径
    • create_time-创建时间
    • update_time-更新时间
  • 每天的访问量tb_daily_view_count
    • id-ID
    • view_count-浏览量
    • create_time-创建时间
    • update_time-更新时间
  • 友情链接表tb_friends
    • id-ID
    • name-友情链接名称
    • logo-友情链接logo
    • url-友情链接
    • order-顺序
    • state-友情链接状态
    • create_time创建时间
    • update_time更新时间
  • 网站信息表tb_settings
    • id-ID
    • key-键
    • value-值
    • create_time-创建时间
    • update_time-更新时间

# 数据表的设计

数据库的创建

CREATE DATABASE `sob_blog_system` CHAR SET utf8mb4 COLLATE utf8mb4_general_ci;
1

怎么设计表呢?

找对象,看看我们要存储什么对象!

  • 我们是不是要保存用户信息呢?

整一张用户表tb_user

CREATE TABLE `sob_blog_system`.`tb_user`(  
  `id` VARCHAR(20) NOT NULL COMMENT 'ID',
  `user_name` VARCHAR(32) NOT NULL COMMENT '用户名',
  `password` VARCHAR(32) NOT NULL COMMENT '密码',
  `roles` VARCHAR(100) NOT NULL COMMENT '角色',
  `avatar` VARCHAR(1024) NOT NULL COMMENT '头像地址',
  `email` VARCHAR(100) COMMENT '邮箱地址',
  `sign` VARCHAR(100) COMMENT '签名',
  `state` VARCHAR(1) NOT NULL COMMENT '状态:0表示删除,1表示正常',
  `reg_ip` VARCHAR(32) NOT NULL COMMENT '注册ip',
  `login_ip` VARCHAR(32) NOT NULL COMMENT '登录Ip',
  `create_time` DATETIME NOT NULL COMMENT '创建时间',
  `update_time` DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • 图片表

整一张图片表tb_images

CREATE TABLE `tb_images` (
  `id` varchar(20) NOT NULL COMMENT 'ID',
  `user_id` varchar(20) NOT NULL COMMENT '用户ID',
  `url` varchar(1024) NOT NULL COMMENT '路径',
  `state` varchar(1) NOT NULL COMMENT '状态(0表示删除,1表正常)',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `fk_user_images_on_user_id` (`user_id`),
  CONSTRAINT `fk_user_images_on_user_id` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
9
10
11
  • 保存分类信息

整一张分类表tb_categories

CREATE TABLE `sob_blog_system`.`tb_categories`(  
  `id` VARCHAR(20) NOT NULL COMMENT 'ID',
  `name` VARCHAR(64) NOT NULL COMMENT '分类名称',
  `pinyin` VARCHAR(128) NOT NULL COMMENT '拼音',
  `description` TEXT NOT NULL COMMENT '描述',
  `order` INT(11) NOT NULL COMMENT '顺序',
  `status` VARCHAR(1) NOT NULL COMMENT '状态:0表示不使用,1表示正常',
  `create_time` DATETIME NOT NULL COMMENT '创建时间',
  `update_time` DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
9
10
11
  • 保存文章数据

整一张文章表tb_article

CREATE TABLE `tb_article` (
  `id` varchar(20) NOT NULL COMMENT 'ID',
  `title` varchar(256) NOT NULL COMMENT '标题',
  `user_id` varchar(20) NOT NULL COMMENT '用户ID',
  `user_avatar` varchar(1024) DEFAULT NULL COMMENT '用户头像',
  `user_name` varchar(32) DEFAULT NULL COMMENT '用户昵称',
  `category_id` varchar(20) NOT NULL COMMENT '分类ID',
  `content` mediumtext NOT NULL COMMENT '文章内容',
  `type` varchar(1) NOT NULL COMMENT '类型(0表示富文本,1表示markdown)',
  `state` varchar(1) NOT NULL COMMENT '状态(0表示已发布,1表示草稿,2表示删除)',
  `summary` text NOT NULL COMMENT '摘要',
  `labels` varchar(128) NOT NULL COMMENT '标签',
  `view_count` int(11) NOT NULL DEFAULT '0' COMMENT '阅读数量',
  `create_time` datetime NOT NULL COMMENT '发布时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `fk_user_article_on_user_id` (`user_id`),
  KEY `fk_category_article_on_category_id` (`category_id`),
  CONSTRAINT `fk_category_article_on_category_id` FOREIGN KEY (`category_id`) REFERENCES `tb_categories` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_user_article_on_user_id` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  • 评论表

整一张评论表tb_comment

CREATE TABLE `tb_comment` (
  `id` varchar(20) NOT NULL COMMENT 'ID',
  `parent_content` text COMMENT '父内容',
  `article_id` varchar(20) NOT NULL COMMENT '文章ID',
  `content` text NOT NULL COMMENT '评论内容',
  `user_id` varchar(20) NOT NULL COMMENT '评论用户的ID',
  `user_avatar` varchar(1024) DEFAULT NULL COMMENT '评论用户的头像',
  `user_name` varchar(32) DEFAULT NULL COMMENT '评论用户的名称',
  `state` varchar(1) NOT NULL COMMENT '状态(0表示删除,1表示正常)',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `fk_user_comment_on_user_id` (`user_id`),
  KEY `fk_article_comment_on_article_id` (`article_id`),
  CONSTRAINT `fk_article_comment_on_article_id` FOREIGN KEY (`article_id`) REFERENCES `tb_article` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_user_comment_on_user_id` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • 保存轮播图

整一张轮播图表tb_looper

CREATE TABLE `tb_looper` (
  `id` varchar(20) NOT NULL COMMENT 'ID',
  `title` varchar(128) NOT NULL COMMENT '轮播图标题',
  `order` int(11) NOT NULL DEFAULT '0' COMMENT '顺序',
  `state` varchar(1) NOT NULL COMMENT '状态:0表示不可用,1表示正常',
  `target_url` varchar(1024) DEFAULT NULL COMMENT '目标URL',
  `image_url` varchar(2014) NOT NULL COMMENT '图片地址',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
9
10
11
  • 统计表

整一张统计的表tb_daily_view_count

CREATE TABLE `sob_blog_system`.`tb_daily_view_count`(  
  `id` VARCHAR(20) NOT NULL COMMENT 'ID',
  `view_count` INT NOT NULL DEFAULT 0 COMMENT '每天浏览量',
  `create_time` DATETIME NOT NULL COMMENT '创建时间',
  `update_time` DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
  • 标签统计表

整一张标签统计表tb_labels

CREATE TABLE `sob_blog_system`.`tb_labels`(  
  `id` VARCHAR(20) NOT NULL COMMENT 'ID',
  `name` VARCHAR(32) NOT NULL COMMENT '标签名称',
  `count` INT NOT NULL DEFAULT 0 COMMENT '数量',
  `create_time` DATETIME NOT NULL COMMENT '创建时间',
  `update_time` DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
  • 保存设置信息

整一张设置表tb_settings

CREATE TABLE `sob_blog_system`.`tb_settings`(  
  `id` VARCHAR(20) NOT NULL COMMENT 'ID',
  `key` VARCHAR(32) NOT NULL COMMENT '键',
  `value` VARCHAR(512) NOT NULL COMMENT '值',
  `create_time` DATETIME NOT NULL COMMENT '创建时间',
  `update_time` DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
  • 友情链接表

整一张友情链接表tb_friends

CREATE TABLE `sob_blog_system`.`tb_friends`(  
  `id` VARCHAR(20) NOT NULL COMMENT 'ID',
  `name` VARCHAR(64) NOT NULL COMMENT '友情链接名称',
  `logo` VARCHAR(1024) NOT NULL COMMENT '友情链接logo',
  `url` VARCHAR(1024) NOT NULL COMMENT '友情链接',
  `order` INT(11) NOT NULL DEFAULT 0 COMMENT '顺序',
  `state` VARCHAR(1) NOT NULL COMMENT '友情链接状态:0表示不可用,1表示正常',
  `create_time` DATETIME NOT NULL COMMENT '创建时间',
  `update_time` DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1
2
3
4
5
6
7
8
9
10
11

# 表拆分

什么情况下需要拆表呢?

我可以把众多的信息写到一张表里吗?

比如说,我有一张用户表tb_user

那我把id,用户名,密码,邮箱,性别,爱好,电话号码,收货地址,头像,最后登录ip,注册ip,QQ号码,注册时间,最后登录时间...都设计到一张表里?

如果查询的时候,来一个select * 那不是要很耗时吗?而且有些数据不是我们每次都用得上的,所以可以根据业务对表进行拆分。

也可以根据数据形式进行拆分,比如说,理论上我们可以把爱好放到tb_user里,一个人有多个爱好吧,可以独立到一张表。

一个人可以有多个收货地址吧,我们独立到一张表里,有需要时,联合查询出来使用即可。

大的项目也是由小的项目演变过去的。作为我们第一个web项目,先不用考虑高并发,高可用,高稳定的问题。先把逻辑走通,实现功能先。

上次更新: 2022/03/28, 23:04:38