首页 > 其他分享 >【引入】BBS_2.0表设计

【引入】BBS_2.0表设计

时间:2023-07-24 20:33:25浏览次数:44  
标签:name models text help time 引入 2.0 BBS verbose

【引入】BBS表设计

  • 一个项目最最最重要的不是业务逻辑的书写
  • 而是前期的表设计,只要将表设计好,后续的功能就会相对顺利一些

【1】用户表(User)

  • 继承 AbstractUser
    • 拓展字段
字段名 类型 注释
phone BigIntegerField 电话
avatar FileField 头像链接
create_time DateField 创建时间
update_time DateTimeField 信息更新时间
is_deleted DateTimeField 是够被删除(注销)
blog OneToOneField 外键字段,一对一,个人站点表

【2】个人站点表(Blog)

字段名 类型 注释
site_name CharField 站点名称
site_title CharField 站点标题
site_theme CharField 站点样式
create_time DateField 创建时间
update_time DateTimeField 信息更新时间

【3】广告信息表(Adv)

字段名 类型 注释
title CharField 广告标题
content CharField 广告详细内容
mobile CharField 广告联系手机号
create_time DateField 创建时间
update_time DateTimeField 信息更新时间
img ImageField 广告投放图片

【4】文章分类表(CategoryCls)

字段名 类型 注释
name CharField 分类名
blog ForeignKey 外键字段,一对多,分类关联站点

【4】文章标签表(CategoryTag)

字段名 类型 注释
tag_name CharField 标签名
blog ForeignKey 标签关联博客

【5】文章表(Article)

字段名 类型 注释
title CharField 文章标题
desc CharField 文章摘要/文章简介
content TextField 文章内容
create_time DateField 发布时间
update_time DateField 更新时间
up_num BigIntegerField 点赞数
down_num BigIntegerField 点踩数
comment_num BigIntegerField 评论数
blog ForeignKey 外键字段,一对多,文章关联站点
category ForeignKey 外键字段,多对多,文章关联标签
tags ManyToManyField 外键字段,一对多,文章关联分类
  • 数据库字段设计优化

    • 虽然点赞数、点踩数和评论数都能从单独的表中查询得出
    • 但是频繁地跨表查询效率很低
  • 在上表内增加普通字段记录相关的数据

    • 在下述变动的时候同步更改

【6】点赞点踩表(UpAndDown)

  • 用来记录哪个用户对哪篇文章点了赞还是点了踩
字段名 类型 注释
user ForeignKey 互动关联个人
article ForeignKey 互动关联文章
up_or_down BooleanField() 点赞/点踩,1为点赞
create_time DateField 创建时间
update_time DateTimeField 信息更新时间

【7】文章评论表(Comment)

  • 用来记录哪个用户给哪篇文章写了哪些评论内容
字段名 类型 注释
user ForeignKey 评论关联个人
article ForeignKey 评论关联文章
content CharField 评论详细内容
parent ForeignKey 自关联
create_time DateField 创建时间
update_time DateTimeField 信息更新时间
is_deleted BooleanField 评论是否被删除,1为存在
  • 根评论
    • 直接评论当前文章内容
  • 子评论
    • 评论别人的评论
  • 跟评论可以有多个子评论(一对多关系)
# ORM 自带的自关联 写法
ForeignKey(to="self",null=True)

【8】表结构图解

表结构图解

【9】数据库建表

版本选择

# Django版本 - Django4.x+ 不支持低版本数据库
django			  3.2
# 链接数据库
mysqlclient       2.2.0
# 兼容 ImageField 字段
Pillow            10.0.0
# mysql数据库
PyMySQL           1.1.0

配置文件

  • 修改指定 User
# 指定默认用户模型表
AUTH_USER_MODEL = 'user.User'

数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bbs_sys_2.0',
        'HOST': "127.0.0.1",
        "PORT": 3306,
        "USER": "root",
        "PASSWORD": "1314521",
        "CHARSET": "utf8",
    }
}

模型类创建

用户表

from django.db import models

# Create your models here.
# Django中自带的用户认证模型
from django.contrib.auth.models import AbstractUser


# 定义用户信息表
class User(AbstractUser):
    '''
    用户表
    继承基础模型:创建时间/更新时间/用户删除标记
    '''
    mobile = models.CharField(verbose_name="手机号", help_text="手机号", max_length=11,
                              default="", blank=True)
    avatar = models.ImageField(verbose_name="用户头像", help_text="用户头像",
                               upload_to="avatar/", default="static/img/default.png")
    create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
    update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
    is_deleted = models.BooleanField(verbose_name="删除标记", help_text="删除标记", default=False)

    # 用户的个人站点展示
    blog = models.OneToOneField(verbose_name="用户关联个人站点", to="blog.Blog", on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = 'user'
        verbose_name = '用户表'
        verbose_name_plural = verbose_name

个人站点表

# 个人站点表
class Blog(models.Model):
    site_name = models.CharField(verbose_name="个人站点名称", help_text="个人站点名称", max_length=32)
    site_title = models.CharField(verbose_name="个人站点标题", help_text="个人站点标题", max_length=32)
    create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
    update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
    # css/js 文件的存储路径
    site_theme = models.CharField(verbose_name="个人站点样式", help_text="个人站点样式", max_length=64)

    class Meta:
        db_table = 'blog'
        verbose_name = '个人站点表'
        verbose_name_plural = verbose_name

广告信息表

# 广告信息表
class Adv(models.Model):
    title = models.CharField(verbose_name="广告标题", help_text="广告标题", max_length=64)
    content = models.TextField(verbose_name="广告详细内容", help_text="广告详细内容")
    create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
    update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
    mobile = models.CharField(verbose_name="手机号", help_text="手机号", max_length=11,
                              default="", blank=True)
    img = models.ImageField(verbose_name="广告图片", help_text="广告图片",
                            upload_to="advImg/", default="")

文章分类表

# 文章分类表
class CategoryCls(models.Model):
    name = models.CharField(verbose_name="文章分类名称", max_length=32)

    # 文章的分类关联博客
    blog = models.ForeignKey(verbose_name="分类关联博客", help_text="分类关联博客",
                             to="blog.Blog", on_delete=models.CASCADE,
                             null=True)

    class Meta:
        verbose_name = '文章分类表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

文章标签表

# 文章标签表
class CategoryTag(models.Model):
    tag_name = models.CharField(verbose_name="文章标签名称", max_length=32)

    # 文章的分类关联博客
    blog = models.ForeignKey(verbose_name="标签关联博客", help_text="分类关联博客",
                             to="blog.Blog", on_delete=models.CASCADE,
                             null=True)

    class Meta:
        verbose_name = '文章标签表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.tag_name

文章表

# 文章表
class Article(models.Model):
    title = models.CharField(verbose_name="文章标题", help_text="文章标题", max_length=64)
    create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
    update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
    desc = models.CharField(verbose_name="文章简介", help_text="文章简介", max_length=255)
    content = models.TextField(verbose_name="文章详细内容", help_text="文章详细内容")
    up_num = models.BigIntegerField(verbose_name="点赞数", help_text="点赞数", default=0)
    # 文章创建时间 - create_time - BaseModel
    # 文章修改更新时间 - update_time - BaseModel
    # 文章是否删除 - is_deleted - BaseModel
    down_num = models.BigIntegerField(verbose_name="点踩数", help_text="点踩数", default=0)
    comment_num = models.BigIntegerField(verbose_name="评论数", help_text="评论数", default=0)

    # 文章关联个人站点
    blog = models.ForeignKey(verbose_name="文章关联个人", help_text="文章关联个人", to="blog.Blog",
                             on_delete=models.CASCADE, null=True)
    # 文章关联文章标签
    category = models.ForeignKey(verbose_name="文章关联标签", help_text="文章关联标签", to="CategoryTag",
                                 on_delete=models.CASCADE, null=True)
    # 文章关联文章分类
    tags = models.ForeignKey(verbose_name="文章关联分类", help_text="文章关联分类", to="CategoryCls",
                             on_delete=models.CASCADE, null=True)

    class Meta:
        verbose_name = "文章表"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

点赞点踩表

# 点赞点踩表
class UpAndDown(models.Model):
    # 互动关联个人
    user = models.ForeignKey(verbose_name="互动关联个人", help_text="互动关联个人", to="user.User",
                             on_delete=models.CASCADE)
    # 互动关联文章
    article = models.ForeignKey(verbose_name="互动关联文章", help_text="互动关联文章", to="Article",
                                on_delete=models.CASCADE)
    # 互动创建时间 - create_time - BaseModel
    create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
    update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
    # 点赞还是点踩
    up_or_down = models.BooleanField(verbose_name="点赞或点踩", help_text="点赞或点踩,1为赞0为踩")

    class Meta:
        verbose_name = "互动表"
        verbose_name_plural = verbose_name

评论表

# 评论表
class Comment(models.Model):
    user = models.ForeignKey(verbose_name="评论绑定个人", help_text="评论绑定个人", to="user.User",
                             on_delete=models.CASCADE)
    article = models.ForeignKey(verbose_name="评论关联文章", help_text="评论关联文章", to="Article", on_delete=models.CASCADE)
    content = models.CharField(verbose_name="评论内容", help_text="评论内容", max_length=255)
    # 评论创建时间 - create_time - BaseModel
    # 评论是否删除 - is_deleted - BaseModel
    create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
    update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
    is_deleted = models.BooleanField(verbose_name="删除标记", help_text="删除标记", default=False)
    # 子评论关联自己 - 允许为空
    parent = models.ForeignKey(verbose_name="子评论", help_text="子评论", to="self", on_delete=models.CASCADE,
                               null=True)

    class Meta:
        verbose_name = "评论表"
        verbose_name_plural = verbose_name

标签:name,models,text,help,time,引入,2.0,BBS,verbose
From: https://www.cnblogs.com/dream-ze/p/17578275.html

相关文章

  • 引入代码来源:深入分析markdown-it-quote插件的魔法
    引入代码来源:深入分析markdown-it-quote插件的魔法markdown-it-quote是一个用于markdown-it的插件,支持多种代码围栏功能。这是SourceCodeTrace项目之一,提供一种MarkdownFence的解析方案,包括对代码块的引用、高亮、链接等功能。SourceCodeTraceProject帮助您在博客、......
  • .net 2.0插件
    .NET2.0插件介绍什么是.NET2.0插件?在软件开发中,插件是一种可扩展的组件,用于在已有的软件应用中添加特定的功能。.NET2.0插件是基于.NETFramework2.0开发的插件,可以在支持.NETFramework2.0的应用程序中使用。.NETFramework是Microsoft提供的一个开发框架,用于......
  • SAP Fiori 2.0 visual theme 施加在传统 SAP 应用上的一些限制
    这个SAPnote介绍了这些限制。SAPFiori2.0引入了名为SAPBelize的新主题。所谓经典应用程序,是指传统的SAPGUI和WebDynpro应用程序。新的SAPFiori视觉主题SAPBelize可在产品S/4HANA1610On-Premise(及更高版本)、SAPFiori2.0的当前云版本以及基于上述产品的......
  • python 使用Queue需要引入哪个包
    Python中使用Queue需要引入哪个包在Python中,如果我们想要使用队列(Queue)数据结构,我们需要引入queue模块。queue模块提供了实现各种队列类型的类,包括FIFO(先进先出)队列、LIFO(后进先出)队列和优先级队列等。通过引入queue模块,我们可以很方便地在我们的代码中使用队列。引入队列模块首......
  • Net6之Jwt认证+Bearer认证 2.0
    以前接触过,写过博客,第二次再写有了新的体会。第一次博客:https://www.cnblogs.com/zhang-3/p/16184067.html过程:生成token令牌(钥匙)添加bearer认证(验证钥匙是否正确)给接口或控制器添加验证(锁)给接口添加显示的小锁1.引入包:System.IdentityModel.Tokens.Jwt这次博客比......
  • 【BBS_1.0项目总结】
    【BBS项目总结】BBS_System_1.0·Chimeng/BBS相关项目-码云-开源中国(gitee.com)【一】项目开发流程简介项目开发流程-Chimengmeng-博客园(cnblogs.com)【二】表设计【一】BBS项目设计-Chimengmeng-博客园(cnblogs.com)【三】注册功能实现【二】注......
  • 拓端tecdat|R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析
    原文链接:http://tecdat.cn/?p=26578 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车......
  • 油猴 js 脚本 引入 jquery
    油猴脚本中引入jQuery的步骤作为一名经验丰富的开发者,我将帮助你学习如何在油猴脚本中引入jQuery。下面是实现这一目标的步骤:步骤描述1下载并安装油猴扩展2创建油猴脚本3引入jQuery库4测试jQuery功能接下来,我将详细说明每个步骤需要执行的操作,......
  • WARN common.Util: Path /E:/hadoop/hadoop-2.2.0/data/namenode should be speci
    如何解决"WARNcommon.Util:Path/E:/hadoop/hadoop-2.2.0/data/namenodeshouldbespecifiedasaURIwhoseschemeandauthorityare'null'.Theuriwereceivedwas:/E:/hadoop/hadoop-2.2.0/data/namenode"错误作为一名经验丰富的开发者,我将指导你如何解决这个错误。首......
  • SSO2.0 28-20230719
                      ......