说起数据库设计,这边就暂且按照我的个人习惯进行,即:

  1. 先分析需要多少个实体
  2. 再分析这几个实体之间的关系
  3. 写出所有的表及其字段
  4. 分析是否要加触发器以及存储过程

此处的设计是基于 TypeORM 的生成逻辑基础进行分析的。

# 模型图

现阶段(V0)版本的数据库设计模型图如下:

database modals

# 数据表分析

# 数据实体

按照前面所作的功能设计以及原型图绘制,可以将本项目所需的数据实体分析罗列如下:

  1. 用户(User)
  2. 标签(Label)
  3. 插画家(Illustrator)
  4. 插画(Illustration)
  5. 图片(Image)
  6. 历史记录(History)
  7. 收藏夹(Favorite)
  8. 评论(Comment)

# 中间表

用以处理实体与实体之间特殊关系的工具表。不包含由 @ManyToMany 自动生成的工具表。

  1. 收藏记录(Collect Record)
  2. 插画推送记录暂存表(Work Push Temp)
  3. 关注记录(Follow)
  4. 喜欢作品(Like Works)

# 实体间关系分析

# 一对一

暂无发现一对一的情景

# 一对多

  1. 一个用户可以有多个收藏夹,一个收藏夹只能属于一个用户

    需要在收藏夹表当中添加用户 id 的外键关联用户表

    更新和删除都是 cascade

  2. 一个用户可以发布多个插画,一个插画只能属于一个用户

    需要在插画表当中添加用户 id 的外键关联用户表

    更新和删除都是 cascade

  3. 一个用户可以发布多个评论,一个评论只能由一个用户发布

    需要在评论表中添加用户 id 的外键关联用户表、

    更新和删除都是 cascade

  4. 一个用户可以有多个浏览的历史记录,一个历史记录只能属于一个用户

    需要在历史记录表当中添加用户 id 的外键关联用户表

    更新和删除都是 cascade

  5. 一个用户可以有多个搜索的历史记录,一个搜索记录只能属于一个用户

    需要在搜索记录表当中添加用户 id 的外键关联用户表

    更新和删除都是 cascade

  6. 一个插画家可以对应多个转载的作品,一个转载的作品只能对应一个插画家

    需要在插画表当中添加插画家 id 的外键关联插画家表。 如果不是转载作品,该字段应被允许为空

    更新和删除都是 set null

  7. 一个插画可以包含多个评论,一个评论只能属于一个插画

    需要在评论表当中添加插画 id 的外键关联插画表。

    更新和删除都是 cascade

  8. 一个插画可以被多个浏览记录包含,一个浏览记录只能包含一个插画

    需要在浏览记录表当中添加插画 id 的外键关联插画表

    更新和删除都是 set null

  9. 一个用户可以有多个收藏记录,一个收藏记录只能对应一个用户

    需要在收藏记录表当中添加用户 id 的外键关联用户表

    更新和删除都是 cascade

  10. 一个插画可以被多个收藏记录包含,一个收藏记录只能包含一个插画

    需要在收藏记录表当中添加插画 id 的外键关联插画表

    更新和删除都是 set null

  11. 一个用户可以接收到多个推送的插画记录,一个推送的插画记录只能对应一个用户

    需要在推送的插画记录表当中添加用户 id 的外键关联用户表

    更新和删除都是 cascade

  12. 一个插画可以被多个推送的插画记录包含,一个推送的插画记录只能包含一个插画

    需要在推送的插画记录表当中添加插画 id 的外键关联插画表

    更新和删除都是 set null

  13. 一个插画可以包含多个图片对象,一个图片对象只能属于一个插画

    需要在图片对象表当中添加插画 id 的外键关联插画表

    更新和删除都是 cascade

# 多对多

  1. 一个用户可以关注多个用户,多个用户也可以关注一个用户

    需要建立一张表用于映射 用户关注之间的多对多关系

  2. 一个用户可以喜欢多个插画标签,多个用户也可以喜欢同一个插画标签

    需要建立一张表用于映射 用户和标签之间的多对多关系

  3. 一个收藏夹可以包含多个作品,多个收藏夹也能够包含同一个作品

    需要建立一张表用于映射 收藏夹和作品的多对多关系

  4. 一个插画可以包含多个插画标签,多个插画可以共用一个插画标签

    需要建立一张表用于映射 插画和插画标签的多对多关系

  5. 一个用户可以喜欢多个插画,多个用户也可以喜欢同一个插画

    需要建立一张表用于映射 用户和插画之间的多对多关系

# 所有涉及的表及其字段

# 用户

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
username string 用户名
email string 用户邮箱
password string 用户密码
backgroundImg string 用户个人主页
avatar string 用户个人头像
signature stirng 用户个人签名
gender boolean 用户性别
fanCount number 粉丝数
followCount number 关注数
originCount number 原创作品数
reprintedCount number 转载作品数
likeCount number 喜欢的作品数
collectCount number 收藏的作品数
favoriteCount number 收藏夹数量
createdTime Date 用户创建时间
updatedTime Date 用户修改时间

# 关注记录

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
follower_id string 外键,关联 users 表,关注别人的用户 id
following_id string 外键,关联 users 表,被关注的用户 id
follow_time Date 关注时间

# 喜欢作品

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
user_id string 外键,关联 users 表,喜欢作品的用户 id
illustration_id string 外键,关联 illustrations 表,喜欢插画的 id
like_time Date 喜欢时间

# 插画家

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
name string 插画家的名称
avatar string 插画家的头像
homeUrl string[] 插画家的个人主页地址(不同用户上传可能会有多个)
workCount number 在这个网站上插画家发布的作品数
createdDate Date 创建时间
updatedDate Date 修改时间

# 收藏夹

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
name string 收藏夹名称
cover string 收藏夹封面图片
introduce string 收藏夹简介
order number 收藏夹顺序(从 0 开始)
createdDate Date 创建时间
updatedDate Date 修改时间
userId string 外键,关联用户表
workCount number 这个收藏夹包含的作品数

# 收藏记录

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
createdAt Date 收藏的日期(收藏的时间)
userId string 外键,关联用户表(是谁收藏了这个插画作品)
illustrationId string 外键,关联插画表(这个收藏记录是哪个插画)

# 插画

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
name string 插画名称
introduce string 插画简介
isReprinted boolean 是否是转载作品
openComment boolean 是否开启评论
isAIGenerated boolean 是否是 AI 生成的
workList string[] 图片 url 列表,一个插画 item 内部可能有多个图片
likeCount number 作品被喜欢的次数
viewCount number 作品被浏览的次数
collectCount number 作品被收藏的次数
commentCount number 作品的评论数
createdDate Date 作品发布的日期
updatedDate Date 作品最后一次被修改的日期
userId string 外键,关联用户表
illustratorId string 外键,关联插画家表。 如果不是转载作品,允许为 null

# 推送插画记录暂存表

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
createdAt Date 推送的日期(推送的时间)
userId string 外键,关联用户表(是谁收到了这个插画作品)
illustrationId string 外键,关联插画表(这个推送记录是哪个插画)

# 图片

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
originUrl string 原图 url 地址
originWidth number 单位 px,原图的宽度
originHeight number 单位 px,原图的高度
thumbnailUrl string 对应缩略图 url 地址
thumbnailWidth number 单位 px,缩略图宽度
thumbnailHeight number 单位 px,缩略图高度
illustration_id string 外键,关联插画表,图片对应的作品

# 标签

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
value string 标签名
color string 标签的颜色,在创建的时候随机赋值
cover string | null 标签背景图
work_count number 该标签下的作品总数

# 评论

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
content string 评论的具体内容
level boolean 评论的等级,true - 一级评论;false - 二级评论
resToCommentId string 这条评论回复的评论 id
resToUserId stirng 这条评论回复的用户 id
createDate Date 评论发布的日期
userId string 外键,关联用户表(是哪个用户发的评论)
illustrationId string 外键,关联插画表(是哪个插画下面的评论)

# 浏览记录

字段名 字段类型 注释
id string 主键,采用 uuid 的形式
last_time Date 上一次浏览过的日期
user_id string 外键,关联用户表(是谁的历史记录)
illustration_id string 外键,关联插画表(这个历史记录是哪个插画)

# 触发器

  1. 当用户发布新作品时,根据作品是否转载的性质,选择 originCount 还是 reprintedCount+1,并且根据是否是转载作品,如果是,则根据原作插画家的名称将 workCount+1。
  2. 当用户更新作品时,后台会将最新提交的数据与原先的数据进行比较,分析出新增的、删除的标签,将新增标签 workCount +1,删除标签则 -1。插画家、转载情况的选择的处理也类似。
  3. 当用户收藏作品时,将自己的收藏数 + 1,并且根据收藏在哪个收藏夹将这个收藏夹的作品数 + 1,同时将这个作品的被收藏数 + 1。
  4. 当用户喜欢作品时,将自己的喜欢数 + 1,同时将这个作品的被喜欢数 + 1。
  5. 当用户发布评论时,将这个作品的评论数 + 1。
  6. 当用户点进某个作品的详情页面时,将这个作品的浏览数 + 1。
  7. 当用户 1 对用户 2 进行关注的时候,用户 1 的关注数 + 1,用户 2 的粉丝数 + 1;如果取关就反过来。

# 存储过程

暂无