首页 > 数据库 >BBS数据库表结构设计

BBS数据库表结构设计

时间:2023-05-14 12:55:08浏览次数:40  
标签:name models 数据库 评论 文章 BBS self 结构设计 verbose

目录

在我们分析完一个项目的需求之后,我们着手开发项目所需要做的第一件事就是设计数据库的表结构及其字段。

一般来说,设计一个数据库的表结构一般要注意以下三点:

  • 第一,把项目的需求转化为一个个数据库中的表
  • 第二,探寻表与表之间的关联关系
  • 第三,牢记以下原则:能用多对多关联关系就尽量不要用一对多关联关系,能用一对多关联关系就尽量别用一对一(原因是为了减少耦合)

BBS需要哪些表?

1.用户表
2.个人站点表
3.文章表
4.文章分类表
5.文章标签表
6.点赞点踩表
7.文章评论表

一、用户表:UserInfo

(通过继承AbstractUser类来扩写Auth_user)
扩展字段
-phone 用户联系方式
-avatar 用户头像
-create_time 注册时间
# 外键字段
-blog 用户表和站点表是一对一的关系

二、博客表:Blog

-site_name 站点名称(jason\lili\kevin)
-site_title 站点标题(名字)
-site_style 站点样式(css文件)

三、文章表:Article

-title  文章标题
-desc 文章摘要
-content 文章内容
-create_time 文章发表的时间

# 数据库字段设计优化
-up_num 文章点赞数
-down_num 文章点踩数
-comment_num 文章评论数

# 外键字段
-blog 个人站点表与文章表是一对多外键关系
-category 文章分类表与文章表是一对多外键关系
-tag 文章标签表与文章表是多对多外键关系  # 再建第三张表


'''
    数据库字段优化设计:我们想统计文章的评论数 点赞数
        通过文章数据跨表查询到文章评论表中对应的数据统计即可
    但是文章需要频繁的展示 每次都跨表查询的话效率极低
        我们在文章表中再创建三个普通字段
之后只需要确保每次操作评论表或者点赞点踩表时同步修改上述三个普通字段即可
'''

四、标签表:Tag

-name 标签名称
# 外键字段
-blog 标签表和站点表是一对多的关系

五、分类表:Category

-name 分类名称
# 外键字段
-blog 分类表和站点表是一对多的关系

六、点赞点踩表:UpAndDown

# 谁在什么时间点赞了哪篇文章
	
-user 用户字段(用户主键)>>>:外键字段
-article 文章字段(文章主键)>>>:外键字段
-is_up 点赞点踩(根据bool值来判断)
-create_time 点赞点踩时间

"""
id    user  article  is_up create_time
1      1	1	1	
2      2        1       0
"""

七、评论表:Comment

# 谁在什么时间给哪篇文章评论了什么内容
    
-user 用户字段(用户主键)>>>:外键字段
-artilce 文章字段(文章主键)>>>:外键字段
-content 评论内容
-create_time 评论时间
-parent_id 外键字段(自关联字段)

"""
id   user   article   content     creare_time    parent_id
1     1	      1		 a	   '时间'	    null     # 表示这是根评论
2     2	      1          b	   '时间'	     1       # 表示这是子评论
3     3       1		 c	   '时间'            2
	
外键字段怎么建立:
方式一:直接跟表名建联系
parent = models.ForeignKey(to='comment')  
方式二:
parent = models.ForeignKey(to='self')  # 自关联
"""

根评论和子评论的概念

根评论:评论文章的评论	
子评论:评论(文章的评论)的评论

eg:
1. PHP是世界上最好的语言
    1.1  python是最好的(子评论,是对1的第一条评论)
    1.2 java是最好的额(子评论,是对1的第二条评论)
根评论和子评论:一对多	

八、文章标签表: Tag2Article

表结构生成(模型类)

from django.db import models

# Create your models here.
"""
先写普通字段
之后再写外键字段
"""
from django.contrib.auth.models import AbstractUser


# 用户表
class UserInfo(AbstractUser):  
    phone = models.BigIntegerField(verbose_name='手机号', null=True)
    # 头像
    avatar = models.FileField(upload_to='avatar/', default='avatar/default.png', verbose_name='用户头像')
    """
    avatar:保存的是文件路径
    upload_to:指定图片上传的路径
    default='avatar/default.png':默认图片

    给avatar字段传文件对象 该文件会自动存储到avatar文件下 然后avatar字段只保存文件路径avatar/default.png
    """
    create_time = models.DateTimeField(auto_now_add=True)
    # auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

    # 外键字段,用户表和站点表是一对一关系
    blog = models.OneToOneField(to='Blog', null=True)

    def __str__(self):
        return self.username

    class Meta:
        verbose_name_plural = '用户表'
        # verbose_name = '用户表'  # 显示,用户表s


# 个人站点表
class Blog(models.Model):  
    site_name = models.CharField(verbose_name='站点名称', max_length=32)
    site_title = models.CharField(verbose_name='站点标题', max_length=32)
    # 简单模拟 带你认识样式内部原理的操作
    site_theme = models.CharField(verbose_name='站点样式', max_length=64)  # 存css/js的文件路径

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = '博客站点表'


# 文章表
class Article(models.Model):  
    title = models.CharField(verbose_name='文章标题', max_length=128)
    desc = models.CharField(verbose_name='文章简介', max_length=255)  # 首页使用的文章摘要
    # 文章内容有很多 一般情况下都是使用TextField
    content = models.TextField(verbose_name='文章内容')
    create_time = models.DateField(auto_now_add=True)

    # 数据库字段设计优化
    up_num = models.BigIntegerField(verbose_name='点赞数', default=0)
    down_num = models.BigIntegerField(verbose_name='点踩数', default=0)
    comment_num = models.BigIntegerField(verbose_name='评论数', default=0)


    # 外键字段
    # 文章表和站点表是一对多关系
    blog = models.ForeignKey(to='Blog', null=True)
    # 文章表和分类表是一对多关系
    category = models.ForeignKey(to='Category', null=True)
    # 文章表和标签表是多对多关系,半自动化建第三张表
    tags = models.ManyToManyField(to='Tag',
                                  through='Article2Tag',
                                  through_fields=('article', 'tag')
                                  )

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = '文章表'


# 文章分类表
class Category(models.Model):  
    name = models.CharField(verbose_name='文章分类', max_length=64)

    # 外键字段,分类表和站点表是一对多关系
    blog = models.ForeignKey(to='Blog', null=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = '分类表'


# 文章标签表
class Tag(models.Model):  
    name = models.CharField(verbose_name='文章标签', max_length=32)

    # 外键字段,标签表和站点表是一对多关系
    blog = models.ForeignKey(to='Blog', null=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = '标签表'


# 第三张表,标签、文章关联表
class Article2Tag(models.Model):  
    article = models.ForeignKey(to='Article')
    tag = models.ForeignKey(to='Tag')

    class Meta:
        verbose_name_plural = '标签关联文章'


# 点赞点踩表
class UpAndDown(models.Model):  
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    is_up = models.BooleanField()  # 传布尔值 存0/1

    def __str__(self):
        return self.user

    class Meta:
        verbose_name_plural = '点赞点踩表'


# 评论表
class Comment(models.Model):  
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    content = models.CharField(verbose_name='评论内容', max_length=255)
    comment_time = models.DateTimeField(verbose_name='评论时间', auto_now_add=True)
    # 自关联
    parent = models.ForeignKey(to='self', null=True)  # 有些评论就是根评论

    def __str__(self):
        return self.content

    class Meta:
        verbose_name_plural = '评论表'

九、数据库配置以及数据库迁移

settings中设置:

AUTH_USER_MODEL = 'app01.UserInfo'

数据库迁移命令:

python36 manage.py makemigrations
python36 manage.py migrate

十、表关系图片

标签:name,models,数据库,评论,文章,BBS,self,结构设计,verbose
From: https://www.cnblogs.com/zjyao/p/17399110.html

相关文章

  • Java:SpringBoot整合MyBatis-Plus实现MySQL数据库的增删改查
    MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。文档https://baomidou.com/目录一、引入坐标二、配置三、CURD测试四、API数据接口一、引入坐标<dependency><groupId>com.baomidou</groupId><artifactId>m......
  • 基于 Mac 通过 VMware-Fusion 在 Kylin-Server-10-SP2 上部署 DM8 数据库
    在Kylin-Server-10-SP2上部署DM8数据库背景安装所需资源下载安装VMware-Fusion安装Kylin-Server安装DM8背景主要为达梦数据库认证管理员培训,提供练习实操环境。达梦数据库管理员的培训内容包括:达梦数据库的安装、建库、用户权限管理、备份、DMSQL、DM开发等单机版数据库常......
  • mysql数据库导出数据字典
     原文地址:https://blog.csdn.net/qq_45047809/article/details/113944103csdn登录后才能复制,故转载过来方便复制。导出hr和attendance表。SELECTTABLE_NAMEAS'表名',COLUMN_NAMEAS'字段名',COLUMN_TYPEAS'数据类型',IS_NULLABLEAS'允许为空......
  • java基于springboot基于vue的地方美食分享网站、美食管理系统,附源码+数据库+lw文档+PP
    1、项目介绍java基于springboot基于vue的地方美食分享网站、美食管理系统。(a)管理员;管理员使用本系统涉到的功能主要有:首页,个人中心,用户管理,外国美食管理,中式美食管理,热门菜品管理,论坛管理,我的收藏管理,留言板管理等功能。(b)用户;用户使用本系统涉到的功能主要有:首页,外国美食,......
  • Python连接数据库
    使用pymysql库:使用pip进行安装:pipinstallpymysql以下是使用pymysql库连接MySQL数据库的示例代码:importpymysql#连接到MySQL数据库conn=pymysql.connect(host='localhost',user='username',#用户名和密码改为自己的password='password',db='data......
  • WEB—系统及数据库等
    前言:搭建平台中间件,网站源码外,容易受到攻击的还有操作系统,数据库,第三方软件平台等,其中此类攻击也能直接影响到WEB或服务器的安全,导致网站或服务器权限的获取。———————————————————————————————————————————————操作系统:Wind......
  • Spring层引入数据库jdbc需要导的包
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><dependency>......
  • 09 CAZyDB数据库
    1、介绍CAZyDB指的是“碳水化合物活性酶集合数据库”(Carbohydrate-ActiveEnzymesdatabase),是一个搜集和分类所有已知的碳水化合物活性酶(CAZY)的公共数据库。它包括各种共同作用于结构多样的寡糖、多糖和其他复杂的碳水化合物的酶类。该数据库组织了与这些酶相关的结构、进化信息......
  • 数据库三大范式
    范式是为了设计出合理的关系型数据库,越高的范式数据库冗余越小。1.第一范式(1NF)列不可再分2.第二范式(2NF)满足1NF,表中的字段必须完全依赖于全部主键而非部分主键字段x和字段y确定一行数据,那么字段z必须依赖x+y,不能只依赖x,或者只依赖y,即不能是部分依赖。设K为某表中......
  • 数据库设计
    数据库概念三层模式系统结构:三级模式,内模式、概念模式、外模式。内模式:管理如何存储物理数据。概念模式:根据需求划分为一张张的表。外模式:对应视图级别,将表进行了一次封装处理。内模式:存储模式,数据库在物理方面的描述,定义记录类型、索引、文件组织方式(概念模式下的一张表,在内模......