08-day05-业务分析和表结构设计
目录
一、业务分析
1.1、价格策略
- 新用户注册拥有免费版的额度
分类 | 标题 | 价格/年 | 创建项目个数 | 每项目成员 | 每个项目空间 | 单文件 | 创建时间 |
---|---|---|---|---|---|---|---|
1 免费版 | 个人免费版 | 0 | 3 | 2 | 20M | 5M | |
2 收费版 | VIP | 199 | 20 | 100 | 50G | 500M | |
3 收费版 | SVIP | 299 | 50 | 200 | 100G | 1G | |
其他 |
1.2、用户设计
用户名 | 手机号 | 密码 | |
---|---|---|---|
1 user1 | 12345678910 | sb | |
2 user1 | 1888888 | db | |
3 user3 | 166666666 | ddb |
1.3、交易策略
ID | 状态 | 用户 | 价格 | 实际支付 | 开始 | 结束 | 数量(年) | 订单 | |
---|---|---|---|---|---|---|---|---|---|
1 | 已支付 | 1 | 1 | 0 | 2020-3-18 | null | 0 | UY12 | |
2 | 已支付 | 2 | 1 | 0 | 2020-3-18 | null | 0 | UY32 | |
3 | 已支付 | 3 | 1 | 0 | 2020-3-18 | null | 0 | UY42 | |
4 | 已支付 | 2 | 2 | 199 | 2020-4-18 | 2021-4-18 | 1 | UY52 | |
5 | 未支付/已支付 | 3 | 3 | 299*2 | 2020-5-18 | 2021-5-18 | 2 | UY62 |
1.4、创建存储
- 基于腾讯对象存储COS存储数据;
1.5、项目策略
ID | 项目名称 | 描述 | 颜色 | 星标 | 参与人数 | 创建者 | 已使用空间 | ||
---|---|---|---|---|---|---|---|---|---|
1 | Project1 | .. | #dddd |
true | 5 | 3 | 5M | ||
2 | Project2 | ... | #uuu7 |
false | 10 | 3 | 1G | ||
3 | SAAS | ... | #uu97 |
false | 20 | 3 | 2G |
1.6、项目参与者策略
ID | 项目 | 用户 | 星标 |
---|---|---|---|
1 | 1 | 1 | true |
2 | 1 | 2 | False |
二、表结构设计
- 注意 :models 中的外键django1.xx不需要设置on_delete,django2.xxx以后必须设置on_delete了;
to:关联的表
on_delete:当该表中的某条数据删除后,关联外键的操作
related_name:反查参数,设置后可以在被关联表中通过该字段反查外键所在表,默认:set_表名
to_field:默认主键,因为mysql只支持主键作为外键,就算你没显式的创建主键,Django会给你自动创建,如果你是DB-first,且没创建主键:数据库默认使用隐藏字段:DB_ROW_ID作为主键
on_delete参数设置
CASCADE:级联删除,当关联表中的数据删除时,该外键也删除
PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT: 设置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体
2.1、价格策略表
- 知识点
update_time = models.DateTimeField('更新时间', default=timezone.now)
create_time= models.DateTimeField('创建时间', auto_now_add=True)
auto_now : 无论是你添加还是修改对象,时间为你添加或者修改的时间。
auto_now_add: 为添加时的时间,更新对象时不会有变动。
class PricePolicy(models.Model):
""" 价格策略 """
category_choices = (
(1, '免费版'),
(2, '收费版'),
(3, '其他'),
)
# 收费类型 : 默认为收费版 由于设置的choices 的数量较少所以使用SmallIntegerField可以比IntegerField减少字段占用
category = models.SmallIntegerField(verbose_name='收费类型', default=2, choices=category_choices)
# 标题
title = models.CharField(verbose_name='标题', max_length=32)
# 价格 : PositiveIntegerField 正整数
price = models.PositiveIntegerField(verbose_name='价格')
# 项目数量
project_num = models.PositiveIntegerField(verbose_name='项目数')
# 项目成员数量
project_member = models.PositiveIntegerField(verbose_name='项目成员数')
# 单项目空间
project_space = models.PositiveIntegerField(verbose_name='单项目空间', help_text='G')
# 单文件大小
per_file_size = models.PositiveIntegerField(verbose_name='单文件大小', help_text="M")
# 创建时间
create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
2.2、交易策略表
- 知识点
blank
设置为True时,字段可以为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。
如果为True,字段允许为空,默认不允许。
null
设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。所以设置IntegerField,DateTimeField型字段可以为空时,需要将blank,null均设为True。
如果为True,空值将会被存储为NULL,默认为False。
如果想设置BooleanField为空时可以选用NullBooleanField型字段。
class Transaction(models.Model):
""" 交易记录 """
status_choice = (
(1, '未支付'),
(2, '已支付')
)
# 状态
status = models.SmallIntegerField(verbose_name='状态', choices=status_choice)
# 订单号 : unique 字段唯一索引,值不能重复,提高查询速度
order = models.CharField(verbose_name='订单号', max_length=64, unique=True)
# 用户 :外键用户表
user = models.ForeignKey(verbose_name='用户', to='UserInfo')
# 价格策略
price_policy = models.ForeignKey(verbose_name='价格策略', to='PricePolicy')
# 购买数量
count = models.IntegerField(verbose_name='数量(年)', help_text='0表示无限期')
# 实际支付金额
price = models.IntegerField(verbose_name='实际支付价格')
# 开始时间 :null=True 默认为空,blank=True 字段可以为空
start_datetime = models.DateTimeField(verbose_name='开始时间', null=True, blank=True)
# 结束时间
end_datetime = models.DateTimeField(verbose_name='结束时间', null=True, blank=True)
# 创建时间
create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
2.3、项目策略表
class Project(models.Model):
""" 项目表 """
COLOR_CHOICES = (
(1, "#56b8eb"), # 56b8eb
(2, "#f28033"), # f28033
(3, "#ebc656"), # ebc656
(4, "#a2d148"), # a2d148
(5, "#20BFA4"), # #20BFA4
(6, "#7461c2"), # 7461c2,
(7, "#20bfa3"), # 20bfa3,
)
# 项目名称
name = models.CharField(verbose_name='项目名', max_length=32)
# 项目颜色,由于设置的choices 的数量较少(数据库存数值),所以使用SmallIntegerField可以比IntegerField减少字段占用
color = models.SmallIntegerField(verbose_name='颜色', choices=COLOR_CHOICES, default=1)
# 项目描述
desc = models.CharField(verbose_name='项目描述', max_length=255, null=True, blank=True)
# 项目已经使用的空间
use_space = models.BigIntegerField(verbose_name='项目已使用空间', default=0, help_text='字节')
# 是否星标
star = models.BooleanField(verbose_name='星标', default=False)
# 参与人数
join_count = models.SmallIntegerField(verbose_name='参与人数', default=1)
# 创建者 :用户表外键(to 等于 to_field)
creator = models.ForeignKey(verbose_name='创建者', to='UserInfo')
# 项目创建时间
create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
bucket = models.CharField(verbose_name='cos桶', max_length=128)
region = models.CharField(verbose_name='cos区域', max_length=32)
# 查询:可以省事;
# 增加、删除、修改:无法完成
# project_user = models.ManyToManyField(to='UserInfo',through="ProjectUser",through_fields=('project','user'))
2.4、项目参与者策略表
-
知识点一 :这一张表的多个字段关联同一张表的ForeignKey外键
-
知识点二 :如果many to many 多对多的关系表如下,可以直接在某张关联表写一个
MnayToMnayFileld
字段(字段创建第三章关系表)
class ProjectUser(models.Model):
""" 项目参与者 """
# 项目 :外键项目表
project = models.ForeignKey(verbose_name='项目', to='Project')
# 参与者 :外键用户表
user = models.ForeignKey(verbose_name='参与者', to='UserInfo')
# 比如写在项目表中
class Project(models.Model):
""" 项目表 """
COLOR_CHOICES = (
(1, "#56b8eb"), # 56b8eb
(2, "#f28033"), # f28033
(3, "#ebc656"), # ebc656
(4, "#a2d148"), # a2d148
(5, "#20BFA4"), # #20BFA4
(6, "#7461c2"), # 7461c2,
(7, "#20bfa3"), # 20bfa3,
)
# 项目名称
name = models.CharField(verbose_name='项目名', max_length=32)
...
...
project_user = models.ManyToManyField(to='UserInfo')
-
知识点三 :
-
项目参与者表
class ProjectUser(models.Model):
""" 项目参与者 """
# 项目 :外键项目表
project = models.ForeignKey(verbose_name='项目', to='Project')
# 参与者 :外键用户表
user = models.ForeignKey(verbose_name='参与者', to='UserInfo')
# 是否星标
star = models.BooleanField(verbose_name='星标', default=False)
# 参与者加入项目时间
create_datetime = models.DateTimeField(verbose_name='加入时间', auto_now_add=True)
2.5、生成表迁移文件,迁移表到数据库
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % python3 manage.py makemigrations
Migrations for 'web_app':
web_app/migrations/0004_pricepolicy_project_projectuser_transaction.py
- Create model PricePolicy
- Create model Project
- Create model Transaction
- Create model ProjectUser
(Bug_manager) daizhe@daizhedeMacBook-Pro Bug_manager % python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, users_app, web_app
Running migrations:
Applying web_app.0004_pricepolicy_project_projectuser_transaction... OK
向往的地方很远,喜欢的东西很贵,这就是我努力的目标。