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外键
    image

  • 知识点二 :如果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')
  • 知识点三 :
    image

  • 项目参与者表

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
posted @ 2021-07-17 09:33  SRE运维充电站  阅读(184)  评论(0编辑  收藏  举报