目录
- 一、用户表:UserInfo
- 二、博客表:Blog
- 三、文章表:Article
- 四、标签表:Tag
- 五、分类表:Category
- 六、点赞点踩表:UpAndDown
- 七、评论表:Comment
- 八、文章标签表: Tag2Article
- 表结构生成(模型类)
- 九、数据库配置以及数据库迁移
- 十、表关系图片
在我们分析完一个项目的需求之后,我们着手开发项目所需要做的第一件事就是设计数据库的表结构及其字段。
一般来说,设计一个数据库的表结构一般要注意以下三点:
- 第一,把项目的需求转化为一个个数据库中的表
- 第二,探寻表与表之间的关联关系
- 第三,牢记以下原则:能用多对多关联关系就尽量不要用一对多关联关系,能用一对多关联关系就尽量别用一对一(原因是为了减少耦合)
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
根据文章与标签的多对多关系手动建立的第三张表
-tag:标签名(外键关联标签表Tag)
-article:属于哪篇文章(外键关联文章表Article)
表结构生成(模型类)
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, verbose_name='注册时间')
# 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, verbose_name='创建时间')
# 数据库字段设计优化
up_num = models.BigIntegerField(verbose_name='点赞数', default=0) # 默认为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'),
null=Ttue
)
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', null=True)
tag = models.ForeignKey(to='Tag', null=True)
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