BBS表设计
【一】表分析概览
【1】项目表设计思路
- 先确定表
- 再确定字段
- 最后确定表与表之间的关系
【2】表分析
(1)用户表
- 继承AbstractUser
- 手机号
- 头像
- 注册时间
一个用户只能对应一个个人站点:一对一关系
(2)个人站点表
- 站点名称
- 例如
https://www.cnblogs.com/dream-ze
中的dream-ze
- 例如
- 站点标题
- 例如自己的个人简介,座右铭等
- 站点样式
- 渲染的css文件地址
(3)文章表
-
文章标题
-
文章简介(摘要)
-
文章内容
-
文章发布时间
-
关联站点
- 一对多关系
-
关联文章标签
- 多对多关系
关联文章分类
- 一对多关系
一个个人站点可以对应多个文章,但是一个文章不能对应多个站点:一对多关系
- 字段设计优化:
- 针对文章的评论数、点赞数、点踩数都可以跨表查询得到
- 但是页面上有很多文章,如果每一篇文章都跨表查询,效率会极低
- 针对上述三个字段,我们可以单独开设一张表用来存储相应的数据
- 文章评论数:每次评论,该字段自增一
- 文章点赞数:每次点赞,该字段自增一
- 文章点踩数:每次点踩,该字段自增一
(4)文章分类表
- 分类名称
文章分类与个人站点之间是一对多外键关系
(5)文章标签表
- 标签名称
例如开朗、乐观、阳光 ...
一个文章可以有多个标签,一个标签可以给多个文章:多对多关系
标签与个人站点之间一对多关系
(6)文章点赞点踩表
- 点赞/点踩
- 关联文章
- 关联用户
(7)文章评论表
- 评论内容
- 评论时间
- 关联文章
- 关联用户
文章评论是可以分层次的,即一个评论可能会有子评论
【1】用户表(UserInfo)
- 继承AbstractUser表
- 拓展字段
字段名 | 类型 | 注释 |
---|---|---|
phone | BigIntegerField | 电话 |
avatar | FileField | 头像链接 |
create_time | DateField | 创建时间 |
blog | OneToOneField(to="Blog") | 外键字段,一对一,个人站点表 |
【2】个人站点表(Blog)
字段名 | 类型 | 注释 |
---|---|---|
site_name | CharField | 站点名称 |
site_title | CharField | 站点标题 |
site_theme | CharField | 站点样式 |
【3】文章分类表(Category)
字段名 | 类型 | 注释 |
---|---|---|
name | CharField | 分类名 |
blog | ForeignKey(to="Blog") | 外键字段,一对多,个人站点 |
【4】文章标签表(CategoryTag)
字段名 | 类型 | 注释 |
---|---|---|
name | CharField | 标签名 |
【5】文章表(Article)
字段名 | 类型 | 注释 |
---|---|---|
title | CharField | 文章标题 |
desc | CharField | 文章摘要/文章简介 |
content | TextField | 文章内容 |
create_time | DateField | 发布时间 |
up_num | BigIntegerField | 点赞数 |
down_num | BigIntegerField | 点踩数 |
comment_num | BigIntegerField | 评论数 |
blog | ForeignKey(to="Blog") | 外键字段,一对多,个人站点 |
category | ForeignKey(to="Category") | 外键字段,多对多,文章标签 |
tags | ManyToManyField(to="CategoryTag") | 外键字段,一对多,文章分类 |
- 虚拟出第三张表作为多对多字段(ArticleToTag)
字段名 | 类型 | 注释 |
---|---|---|
article | ForeignKey(to="Article") | 外键字段,一对多,文章 |
tag | ForeignKey(to="CategoryTag") | 外键字段,一对多,标签 |
- 数据库字段设计优化
- 虽然点赞数、点踩数和评论数都能从单独的表中查询得出
- 但是频繁地跨表查询效率很低
- 在上表内增加普通字段记录相关的数据
- 在下述变动的时候同步更改
【6】点赞点踩表(UpAndDown)
- 用来记录哪个用户对哪篇文章点了赞还是点了踩
字段名 | 类型 | 注释 |
---|---|---|
user | ForeignKey(to="UserInfo") | 用户主键值 |
article | ForeignKey(to="Article") | 文章主键值 |
is_up | BooleanField() | 是否点赞 |
【7】文章评论表(Comment)
- 用来记录哪个用户给哪篇文章写了哪些评论内容
字段名 | 类型 | 注释 |
---|---|---|
user | ForeignKey(to='UserInfo') | 用户主键值 |
article | ForeignKey(to="Article") | 文章主键值 |
content | CharField() | 评论内容 |
comment_time | DateTimeField | 评论时间 |
parent | ForeignKey(to="self",null=True) | 自关联 |
- 根评论
- 直接评论当前文章内容
- 子评论
- 评论别人的评论
- 跟评论可以有多个子评论(一对多关系)
# ORM 自带的自关联 写法
ForeignKey(to="self",null=True)