Vue & SpringBoot 从零实现博客系统 (二)

本文系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;
    

后记

至此,一个数据库算是设计完了,对于我来说有很多不足,但是当我发觉的时候,编码已经快完成了,数据库的设计根本米有考虑数据库的函数依赖和范式,回想起以前学的知识,到项目中还是蛮有用的。

发布了100 篇原创文章 · 获赞 142 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/coder_what/article/details/101207350