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)

【8】表结构图解

表结构图解

posted @ 2024-03-27 09:01  -半城烟雨  阅读(11)  评论(0编辑  收藏  举报