说起数据库设计,这边就暂且按照我的个人习惯进行,即:
- 先分析需要多少个实体
- 再分析这几个实体之间的关系
- 写出所有的表及其字段
- 分析是否要加触发器以及存储过程
此处的设计是基于 TypeORM 的生成逻辑基础进行分析的。
# 模型图
现阶段(V0)版本的数据库设计模型图如下:
# 数据表分析
# 数据实体
按照前面所作的功能设计以及原型图绘制,可以将本项目所需的数据实体分析罗列如下:
- 用户(User)
- 标签(Label)
- 插画家(Illustrator)
- 插画(Illustration)
- 图片(Image)
- 历史记录(History)
- 收藏夹(Favorite)
- 评论(Comment)
# 中间表
用以处理实体与实体之间特殊关系的工具表。不包含由 @ManyToMany 自动生成的工具表。
- 收藏记录(Collect Record)
- 插画推送记录暂存表(Work Push Temp)
- 关注记录(Follow)
- 喜欢作品(Like Works)
# 实体间关系分析
# 一对一
暂无发现一对一的情景
# 一对多
-
一个用户可以有多个收藏夹,一个收藏夹只能属于一个用户
需要在收藏夹表当中添加用户 id 的外键关联用户表
更新和删除都是 cascade
-
一个用户可以发布多个插画,一个插画只能属于一个用户
需要在插画表当中添加用户 id 的外键关联用户表
更新和删除都是 cascade
-
一个用户可以发布多个评论,一个评论只能由一个用户发布
需要在评论表中添加用户 id 的外键关联用户表、
更新和删除都是 cascade
-
一个用户可以有多个浏览的历史记录,一个历史记录只能属于一个用户
需要在历史记录表当中添加用户 id 的外键关联用户表
更新和删除都是 cascade
-
一个用户可以有多个搜索的历史记录,一个搜索记录只能属于一个用户
需要在搜索记录表当中添加用户 id 的外键关联用户表
更新和删除都是 cascade
-
一个插画家可以对应多个转载的作品,一个转载的作品只能对应一个插画家
需要在插画表当中添加插画家 id 的外键关联插画家表。 如果不是转载作品,该字段应被允许为空
更新和删除都是 set null
-
一个插画可以包含多个评论,一个评论只能属于一个插画
需要在评论表当中添加插画 id 的外键关联插画表。
更新和删除都是 cascade
-
一个插画可以被多个浏览记录包含,一个浏览记录只能包含一个插画
需要在浏览记录表当中添加插画 id 的外键关联插画表
更新和删除都是 set null
-
一个用户可以有多个收藏记录,一个收藏记录只能对应一个用户
需要在收藏记录表当中添加用户 id 的外键关联用户表
更新和删除都是 cascade
-
一个插画可以被多个收藏记录包含,一个收藏记录只能包含一个插画
需要在收藏记录表当中添加插画 id 的外键关联插画表
更新和删除都是 set null
-
一个用户可以接收到多个推送的插画记录,一个推送的插画记录只能对应一个用户
需要在推送的插画记录表当中添加用户 id 的外键关联用户表
更新和删除都是 cascade
-
一个插画可以被多个推送的插画记录包含,一个推送的插画记录只能包含一个插画
需要在推送的插画记录表当中添加插画 id 的外键关联插画表
更新和删除都是 set null
-
一个插画可以包含多个图片对象,一个图片对象只能属于一个插画
需要在图片对象表当中添加插画 id 的外键关联插画表
更新和删除都是 cascade
# 多对多
-
一个用户可以关注多个用户,多个用户也可以关注一个用户
需要建立一张表用于映射 用户关注之间的多对多关系
-
一个用户可以喜欢多个插画标签,多个用户也可以喜欢同一个插画标签
需要建立一张表用于映射 用户和标签之间的多对多关系
-
一个收藏夹可以包含多个作品,多个收藏夹也能够包含同一个作品
需要建立一张表用于映射 收藏夹和作品的多对多关系
-
一个插画可以包含多个插画标签,多个插画可以共用一个插画标签
需要建立一张表用于映射 插画和插画标签的多对多关系
-
一个用户可以喜欢多个插画,多个用户也可以喜欢同一个插画
需要建立一张表用于映射 用户和插画之间的多对多关系
# 所有涉及的表及其字段
# 用户
字段名 | 字段类型 | 注释 |
---|---|---|
id | string | 主键,采用 uuid 的形式 |
username | string | 用户名 |
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 | 外键,关联插画表(这个历史记录是哪个插画) |
# 触发器
- 当用户发布新作品时,根据作品是否转载的性质,选择 originCount 还是 reprintedCount+1,并且根据是否是转载作品,如果是,则根据原作插画家的名称将 workCount+1。
- 当用户更新作品时,后台会将最新提交的数据与原先的数据进行比较,分析出新增的、删除的标签,将新增标签 workCount +1,删除标签则 -1。插画家、转载情况的选择的处理也类似。
- 当用户收藏作品时,将自己的收藏数 + 1,并且根据收藏在哪个收藏夹将这个收藏夹的作品数 + 1,同时将这个作品的被收藏数 + 1。
- 当用户喜欢作品时,将自己的喜欢数 + 1,同时将这个作品的被喜欢数 + 1。
- 当用户发布评论时,将这个作品的评论数 + 1。
- 当用户点进某个作品的详情页面时,将这个作品的浏览数 + 1。
- 当用户 1 对用户 2 进行关注的时候,用户 1 的关注数 + 1,用户 2 的粉丝数 + 1;如果取关就反过来。
# 存储过程
暂无