在做完一个springboot的个人博客项目,想总结下从数据库建表到完成的对自己有点价值的点,包括碰到的问题及解决过程和方法,希望读者也能找到自己想要的。这篇博客主要是讲解建表的过程。
我在这个项目中建表的方式可能与平常的习惯不太一样(可能来自于学JPA后的后遗症吧,不过JPA不需要自己建表,Mybatis需要自己建表,转技术时就得会建表)。
先建立实体类
实体类有博客类,评论类,类别类,标签类,用户类。
主要以博客类为主体,
对应关系:
- 博客与评论是一对多
- 博客与类别是多对一
- 博客与标签是多对多
- 博客与用户是多对一即多个博客对应一个用户,一个用户下有多个博客
- 还有一个关系是评论中有子评论和父评论,父评论与子评论是一对多的
根据这些关系建立实体类(自行忽略getset及构造方法,这里主要看字段):
博客类:
package com.yuer.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Blog implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String title; // 博客标题
private String firstPicture; // 首图
private String content; // 内容
private String flag;
private Integer viewCounts; // 游览次数
private Boolean isAppreciate; // 是否开启赞赏
private Boolean isOpenCopyright; // 是否开启装载声明
private Boolean isComment; // 是否开启评论
private Boolean isPublished; // 是否发布
private Boolean isRecommend; // 是否推荐
private Date createTime; // 创建时间
private Date updateTime; // 更新时间
private User user;
private List<Tag> tags = new ArrayList<>();
private Type type;
private List<Comment> comments = new ArrayList<>();
private String tagIds;
// 描述
private String description;
// 为方便展示,忽略getset及空构造
}
评论类:
package com.yuer.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Comment implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String nickName; // 昵称
private String headPicture; // 头像
private String email; // 邮箱
private String content; // 评论内容
private Date createTime; // 创建时间
private Blog blog;
private Comment parent;
private List<Comment> comments = new ArrayList<Comment>();
// 是否是博主产生的评论
private boolean adminComment;
}
类别类:
package com.yuer.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Type implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String typeName; // 类别名
private List<Blog> blogs = new ArrayList<Blog>();
private Integer blogNum = 0;
}
标签类:
package com.yuer.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Tag implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String tagName; // 标签名
private List<Blog> blogs = new ArrayList<>();
private Integer blogNum = 0;
}
用户类:
package com.yuer.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String userName; // 用户名
private String nickName; // 昵称
private String password; // 密码
private String email; // 邮箱
private Integer type; // 留待以后扩展,默认为0,管理员
private String headImage; // 头像
private Date createTime; // 创建时间
private Date updateTime; // 更新时间
private List<Blog> blogs = new ArrayList<>();
}
看完这些类中的字段,你应该会发现,一对多,如博客下有多个评论,则博客类中会有个list集合放置comment,而评论类中会直接声明一个博客类的对象。如果是多对一,如多个博客属于一个用户,则博客类中会声明一个用户类的对象,而用户类中有个博客类的list集合。如果是多对多,如一个博客有多个标签,,一个标签有多个博客,则两个类中分别由对方的list集合。
总结:哪方属于多,哪方只需要声明对方的一个对象。哪方属于一,则哪方会声明对方的list集合。
数据库中建表
建表时对应实体类建,不过对于这些关系而言,则是外键的引用,有个特殊的表还得另外建,对于多对多关系的表,得单独建一个表处理多对多的关系。
看如下数据库表设计:
除了博客和标签的关系需要另建一个表来维护以外,其他关系,如一对多,则多的那一端(那个表)会声明一的那个表的id的一个字段,如下图:
博客表:
(这里另插一句话,建表时id字段尽量使用自增,还有对于存储很多内容的字段如博客的正文需要声明成longtext,而用来存储boolean值的可以声明为bit,这个类型只存储0或1)
这张图中对于类别和用户就分别声明了一个字段进行外键关联,方便查数据。
接下来看看其他表吧:
评论表:
类别表:
标签表:
用户表:
多对多关系维护表:
这个可能不太好理解,通过我已经添加的数据进行理解:
总结
根据这些图片和实体类进行理解,对于这种简单的关系建表自然就再也不是问题了,博主特此记录一下。