JavaWeb博客系统后端-系列
JavaWeb博客系统后端-重构ResponseResult
数据库的选择
选择数据库要考虑
- 是否收费
- 性能(时间和空间维度)
- 场景
- 技术掌握程度
其实呀,选择有两种情况
- 第一种是你去公司上班,别人掌权,由CTO选择。公司已经用什么数据库了就用什么数据库
- 第二种是你会什么选择什么
你自己选择也没关系,前期还是自己会什么使用什么吧。
目前主要流行的有Mysql,有Mongodb,Oracle
- Oracle 比较适合超大型的系统,也收费
- Mysql,免费。现在很多公司都去O化,也就是不用Oracle了。
- Mongodb,企业版收费,社区版本免费,详情请查看MongoDB Licensing
所以,大多数情况下我们选择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;
怎么设计表呢?
找对象,看看我们要存储什么对象!
- 我们是不是要保存用户信息呢?
整一张用户表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;
- 图片表
整一张图片表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;
- 保存分类信息
整一张分类表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;
- 保存文章数据
整一张文章表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;
- 评论表
整一张评论表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;
- 保存轮播图
整一张轮播图表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;
- 统计表
整一张统计的表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;
- 标签统计表
整一张标签统计表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;
- 保存设置信息
整一张设置表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;
- 友情链接表
整一张友情链接表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;
表拆分
什么情况下需要拆表呢?
我可以把众多的信息写到一张表里吗?
比如说,我有一张用户表tb_user
那我把id,用户名,密码,邮箱,性别,爱好,电话号码,收货地址,头像,最后登录ip,注册ip,QQ号码,注册时间,最后登录时间...都设计到一张表里?
如果查询的时候,来一个select * 那不是要很耗时吗?而且有些数据不是我们每次都用得上的,所以可以根据业务对表进行拆分。
也可以根据数据形式进行拆分,比如说,理论上我们可以把爱好放到tb_user里,一个人有多个爱好吧,可以独立到一张表。
一个人可以有多个收货地址吧,我们独立到一张表里,有需要时,联合查询出来使用即可。
大的项目也是由小的项目演变过去的。作为我们第一个web项目,先不用考虑高并发,高可用,高稳定的问题。先把逻辑走通,实现功能先。