本文系Vue & SpringBoot从零实现博客系统第二部分 数据库设计
数据库设计
-
因为博客系统主要是文章,评论等等所以数据库也主要集中在这些方面
-
但是说句实在话,我的数据库设计的并不好,可以看阿里巴巴Java开发手册
-
同时我也没有使用外键,因为看到了上面的开发手册上不建议用我就没有用
-
因为第一次搭建博客,缺乏经验,就没有用系统的工具画出数据库的E-R图,导致后来在重构了数据库的某些模块,如果你也和我一样想搭建一个博客,那么我希望你一定要想清楚需求,画好E-R图,设计好接口之后再开始编码
推荐工具
-
连接数据库可用DataGrip
-
设计数据库可用 PowerDesigner等数据库建模工具
-
当数据库的DDL写好以后,可以用Mybatis的逆向来生成domain的代码
一个小技巧
-
由于我用的MySQL,可以在构建数据库的时候通过
create_by datetime default CURRENT_TIMESTAMP not null comment '创建时间'
这个语句来显示创建数据库的时间通过
modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改日期'
来显示修改时间
文章
文章有三个表
-
一个是文章信息,包括文章的标题,总结,浏览次数,喜欢人数
-- auto-generated definition create table article_info ( id bigint(40) auto_increment comment '主键' primary key, title varchar(50) not null comment '文章标题,不能重复', summary varchar(300) not null comment '文章简介,默认100个汉字以内', traffic int(10) default 0 not null comment '文章访问量', create_by datetime default CURRENT_TIMESTAMP not null comment '创建时间', modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改日期', love_num int(10) default 0 not null comment '喜欢人数', constraint article_info_title_uindex unique (title) ) comment '文章信息' charset = utf8;
-
一个是文章内容,包括文章的markdown类型文件,同时和文章信息关联起来
-- auto-generated definition create table article_content ( id bigint(40) auto_increment primary key, content text not null, article_id bigint(40) not null comment '对应文章ID', create_by datetime default CURRENT_TIMESTAMP not null comment '创建时间', modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', constraint article_content_article_id_uindex unique (article_id) ) comment '文章内容' charset = utf8;
评论
-
因为是多级评论,所以要除了评论内容,还要有父级评论,没有父级命令则该地方设为0
-
同时因为有用户,评论表中还应有用户id
-- auto-generated definition create table comment_info ( id bigint(40) auto_increment comment '主键' primary key, content varchar(200) default '' not null comment '留言/评论内容', create_by datetime default CURRENT_TIMESTAMP not null comment '创建日期', modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, parent_id bigint(40) default 0 not null comment '父类id', user_id bigint(40) null comment '用户id' ) comment '留言表' charset = utf8;
用户
-
用户分为三类,ANY,USER,ADMIN,只要有IP登录,就会在该数据库进行写入,ip是唯一的
--auto-generated definition create table sys_user ( id bigint(40) auto_increment comment '主键' primary key, name varchar(50) default '未注册' null comment '唯一值,昵称', role varchar(30) not null comment '角色', create_by datetime default CURRENT_TIMESTAMP not null, modified_by datetime default CURRENT_TIMESTAMP null, browser varchar(100) null comment '浏览器', region varchar(50) default '未知' null comment '地址,ip与之对应', connect varchar(50) default '未注册' null comment '联系方式', ip varchar(50) null, num bigint(40) default 1 null comment '用户浏览次数 ', constraint sys_user_ip_uindex unique (ip) ) comment '用户表';
-
由于ADMIN只有一个,那就是我,所以我又另建了一个数据库专门存储我加密的密码
sqlto-generated definition create table sys_me ( id bigint(40) auto_increment, name varchar(50) null, password varchar(50) not null, u_id bigint(40) not null, constraint sys_me_id_uindex unique (id), constraint sys_me_name_uindex unique (name) ); alter table sys_me add primary key (id);
分类
-
分类也需要是多级的,所以要有父类id,同时也需要包括该分类所属的文章数量
--sql-generated definition create table category_info ( id bigint(40) auto_increment primary key, name varchar(20) not null comment '分类名称', number tinyint(10) default 0 not null comment '该分类下的文章数量', create_by datetime default CURRENT_TIMESTAMP not null comment '分类创建时间', modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '分类修改时间', parent_id bigint(40) default 0 not null comment '父类id,默认为0' ) comment '分类信息,name和subName可以重复' charset = utf8;
文章-用户
-
这个主要是为了对应某篇文章和点赞人数的关系,防止同一用户多次点赞
-- asqlenerated definition create table article_lover ( id bigint(40) auto_increment primary key, article_id bigint(40) not null comment '对应文章id', user_id bigint(40) not null comment '用户id', create_by datetime default CURRENT_TIMESTAMP not null comment '创建时间', modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' ) comment '文章和点赞人数的关联表' charset = utf8;
文章-评论
-
将文章评论和文章信息关联起来,多了一个is_effective是为了显示文章是否可见
-- auto-generated definition create table article_comment ( id bigint(40) auto_increment primary key, article_id bigint(40) not null comment '文章ID', comment_id bigint(40) not null comment '对应的留言ID', create_by datetime default CURRENT_TIMESTAMP not null comment '创建时间', modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, is_effective tinyint(1) default 1 not null comment '是否有效,默认为1有效,置0无效' ) comment '文章评论关联表' charset = utf8;
文章-分类
-
将文章和分类对应起来
-- auto-generated definition create table article_category ( id bigint(40) auto_increment primary key, category_id bigint(40) not null comment '分类id', article_id bigint(40) not null comment '文章id', create_by datetime default CURRENT_TIMESTAMP not null comment '创建时间', modified_by datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' ) comment '文章和分类的关联表' charset = utf8;
日志
-
最后一个是日志,记录ip的访问路径和时间
-- auto-generated definition create table sys_log ( id bigint(40) auto_increment comment '主键' primary key, ip varchar(20) not null comment '访问者ip ', create_by datetime default CURRENT_TIMESTAMP not null comment '操作时间', operate_url varchar(120) default '' not null comment '操作的访问url', operate_by varchar(100) default '' null comment '操作的客户端' ) comment '访问日志' charset=utf8;
后记
至此,一个数据库算是设计完了,对于我来说有很多不足,但是当我发觉的时候,编码已经快完成了,数据库的设计根本米有考虑数据库的函数依赖和范式,回想起以前学的知识,到项目中还是蛮有用的。