一、商品数据库表设计

1.1 SPU和SKU

在电商中对于商品,有两个重要的概念:SPUSKU

1. SPU介绍      【即为商品的一个概述,一种商品的统称】

  • SPU = Standard Product Unit (标准产品单位)

    • SPU是商品信息聚合的最小单位,是一组可服用、易检索的标准化信息的集合,该集合描述了一个产品的特性。
    • 通俗的讲,属性值、特性相同的商品就可以归类到一类SPU。
    • 例如:
      • iPhone X 就是一个SPU,与商家、颜色、款式、规格、套餐等都无关。

2. SKU介绍    【即为商品的一个详细信息】

  • SKU = Stock Keeping Unit (库存量单位)

    • SKU即库存进出计量的单位,可以是以件、盒等为单位,是物理上不可分割的最小存货单元。
    • 通俗的讲,SKU是指一款商品,每款都有一个SKU,便于电商品牌识别商品。
    • 例如:
      • iPhone X 全网通 黑色 256G 就是一个SKU,表示了具体的规格、颜色等信息。

思考

SPU和SKU是怎样的对应关系?

  • 一对一?
  • 一对多?

1.2 首页广告数据库表分析

1. 首页广告数据库表分析

一对多,FK简称外键

2. 定义首页广告模型类

apps.contents.models.py

from django.db import models
from meiduo_mall.utils.models import BaseModel# Create your models here.
class ContentCategory(BaseModel):"""广告内容类别"""name = models.CharField(max_length=50, verbose_name='名称')key = models.CharField(max_length=50, verbose_name='类别键名')class Meta:db_table = 'tb_content_category'verbose_name = '广告内容类别'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass Content(BaseModel):"""广告内容"""category = models.ForeignKey(ContentCategory, on_delete=models.PROTECT, verbose_name='类别')title = models.CharField(max_length=100, verbose_name='标题')url = models.CharField(max_length=300, verbose_name='内容链接')image = models.ImageField(null=True, blank=True, verbose_name='图片')text = models.TextField(null=True, blank=True, verbose_name='内容')sequence = models.IntegerField(verbose_name='排序')status = models.BooleanField(default=True, verbose_name='是否展示')class Meta:db_table = 'tb_content'verbose_name = '广告内容'verbose_name_plural = verbose_namedef __str__(self):return self.category.name + ': ' + self.title

迁移数据库:

1.3 商品信息数据库表分析

1. 商品信息数据库表分析

2. 定义商品信息模型类

新建子应用goods

在数据库迁移之前必须要注册子应用。

goods.models.py

from django.db import models
from meiduo_mall.utils.models import BaseModel# Create your models here.
class GoodsCategory(BaseModel):"""商品类别"""name = models.CharField(max_length=10, verbose_name='名称')parent = models.ForeignKey('self', related_name='subs', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父类别')class Meta:db_table = 'tb_goods_category'verbose_name = '商品类别'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass GoodsChannelGroup(BaseModel):"""商品频道组"""name = models.CharField(max_length=20, verbose_name='频道组名')class Meta:db_table = 'tb_channel_group'verbose_name = '商品频道组'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass GoodsChannel(BaseModel):"""商品频道"""group = models.ForeignKey(GoodsChannelGroup, verbose_name='频道组名')category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='顶级商品类别')url = models.CharField(max_length=50, verbose_name='频道页面链接')sequence = models.IntegerField(verbose_name='组内顺序')class Meta:db_table = 'tb_goods_channel'verbose_name = '商品频道'verbose_name_plural = verbose_namedef __str__(self):return self.category.nameclass Brand(BaseModel):"""品牌"""name = models.CharField(max_length=20, verbose_name='名称')logo = models.ImageField(verbose_name='Logo图片')first_letter = models.CharField(max_length=1, verbose_name='品牌首字母')class Meta:db_table = 'tb_brand'verbose_name = '品牌'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass SPU(BaseModel):"""商品SPU"""name = models.CharField(max_length=50, verbose_name='名称')brand = models.ForeignKey(Brand, on_delete=models.PROTECT, verbose_name='品牌')category1 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat1_spu', verbose_name='一级类别')category2 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat2_spu', verbose_name='二级类别')category3 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat3_spu', verbose_name='三级类别')sales = models.IntegerField(default=0, verbose_name='销量')comments = models.IntegerField(default=0, verbose_name='评价数')desc_detail = models.TextField(default='', verbose_name='详细介绍')desc_pack = models.TextField(default='', verbose_name='包装信息')desc_service = models.TextField(default='', verbose_name='售后服务')class Meta:db_table = 'tb_spu'verbose_name = '商品SPU'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass SKU(BaseModel):"""商品SKU"""name = models.CharField(max_length=50, verbose_name='名称')caption = models.CharField(max_length=100, verbose_name='副标题')spu = models.ForeignKey(SPU, on_delete=models.CASCADE, verbose_name='商品')category = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, verbose_name='从属类别')price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='单价')cost_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='进价')market_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='市场价')stock = models.IntegerField(default=0, verbose_name='库存')sales = models.IntegerField(default=0, verbose_name='销量')comments = models.IntegerField(default=0, verbose_name='评价数')is_launched = models.BooleanField(default=True, verbose_name='是否上架销售')default_image_url = models.CharField(max_length=200, default='', null=True, blank=True, verbose_name='默认图片')class Meta:db_table = 'tb_sku'verbose_name = '商品SKU'verbose_name_plural = verbose_namedef __str__(self):return '%s: %s' % (self.id, self.name)class SKUImage(BaseModel):"""SKU图片"""sku = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku')image = models.ImageField(verbose_name='图片')class Meta:db_table = 'tb_sku_image'verbose_name = 'SKU图片'verbose_name_plural = verbose_namedef __str__(self):return '%s %s' % (self.sku.name, self.id)class SPUSpecification(BaseModel):"""商品SPU规格"""spu = models.ForeignKey(SPU, on_delete=models.CASCADE, related_name='specs', verbose_name='商品SPU')name = models.CharField(max_length=20, verbose_name='规格名称')class Meta:db_table = 'tb_spu_specification'verbose_name = '商品SPU规格'verbose_name_plural = verbose_namedef __str__(self):return '%s: %s' % (self.spu.name, self.name)class SpecificationOption(BaseModel):"""规格选项"""spec = models.ForeignKey(SPUSpecification, related_name='options', on_delete=models.CASCADE, verbose_name='规格')value = models.CharField(max_length=20, verbose_name='选项值')class Meta:db_table = 'tb_specification_option'verbose_name = '规格选项'verbose_name_plural = verbose_namedef __str__(self):return '%s - %s' % (self.spec, self.value)class SKUSpecification(BaseModel):"""SKU具体规格"""sku = models.ForeignKey(SKU, related_name='specs', on_delete=models.CASCADE, verbose_name='sku')spec = models.ForeignKey(SPUSpecification, on_delete=models.PROTECT, verbose_name='规格名称')option = models.ForeignKey(SpecificationOption, on_delete=models.PROTECT, verbose_name='规格值')class Meta:db_table = 'tb_sku_specification'verbose_name = 'SKU规格'verbose_name_plural = verbose_namedef __str__(self):return '%s: %s - %s' % (self.sku, self.spec.name, self.option.value)

数据库迁移:

美多商城之商品(商品数据库表设计)相关推荐

  1. 商城 商品模块 数据库 表设计

    商城 商品模块 数据库 表设计 要实现一个商城,对于商品模块中的数据库表设计不懂,主要是:相同类别的产品的产品参数相同,不同类别的不同,这里就不懂要怎么设计了,所以上网找几篇博客了解. 什么是SPU. ...

  2. PHP商城 商品模块 数据库 表设计

    为什么80%的码农都做不了架构师?>>>    表关系: 分类表 <= 商品表 <= SKU表(库存表) 分类表 <= 属性名 <= 属性值 商品表 < ...

  3. 美多商城项目:商品数据库表设计、准备商品数据、首页广告、商品列表页

    一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 SPU = Standard Product Unit (标准产品单位) SPU是商 ...

  4. Python项目实战 6.1 商品:商品数据库表设计

    目录 一.SPU和SKU 二.首页广告数据库表分析 三.商品信息数据库表分析 一.SPU和SKU 待更新 二.首页广告数据库表分析 待更新 三.商品信息数据库表分析 待更新

  5. 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区

    数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...

  6. mysql设计积分兑换表_积分系统数据库表设计.docx

    积分系统数据库表设计 文件编号:JHDZ/SJ 密 级: 云上城积分功能数据库设计文档 项目名称:<云上城>项目代号:XXX版 本:V1.0编制单位:平台运营编制日期:2014-10-08 ...

  7. 数据库表设计(一)——基本原则和概念

    数据库表设计的技巧 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的 ...

  8. 关于国产数据库表设计PDManer工具的使用

    关于国产数据库表设计PDManer工具的使用 一 PDManer简介 二 PDManer的使用 1 简单案列说明 1 界面说明 2 内容说明 1 数据表 2 视图 3 关系图 4 数据字典 一直以来, ...

  9. Oracle数据库表设计时的注意事项

    Oracle数据库表设计时的注意事项  表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据 ...

最新文章

  1. python字典一键多值_python字典中如何一键多值的写入?
  2. Access里执行SQL
  3. java开发app教程,进阶加薪全靠它!
  4. ubuntu 访问php没反应,linux - 在Ubuntu中,我对php.ini进行了更改,但没有任何反应 - Ubuntu问答...
  5. mysql 遍历二叉树_【自考】数据结构之二叉树遍历
  6. 用科幻艺术描绘未知的魅力-环境篇
  7. 如何使用Swift Playgrounds制作东西
  8. docker安装mysql_Docker 安装 MySQL
  9. 希望得到学术会议的及时回复该怎么说_张烨:在“选矿”博士的世界里,脚踏实地从来都不是说说而已!| 中南达人NO.188...
  10. mysql子查询_笔记之MySQL子查询
  11. SQL注入:5、SQL盲注
  12. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...
  13. EDM邮件营销之如何制作模板
  14. linux内核关闭igmp,Linux kernel IGMP多个安全漏洞
  15. Python学习教程:Python3内置模块之base64编解码方法小结
  16. Flutter拓展 一步一步教你安装Flutter(最火的移动框架)
  17. 介绍中国传统节日的网页html,中国传统节日介绍:中秋节
  18. JAVA (Graphics2D)解决合成图片失真问题
  19. Python XML文件快速排版
  20. telegram自动发信息_zabbix调用telegram机器人发送报警消息

热门文章

  1. 亚马逊云科技在中国区域上线机器学习新服务,打造广泛而深入的人工智能与机器学习工具集
  2. 必读!53个Python经典面试题详解
  3. 如何用知识图谱挖掘商业数据背后的宝藏?
  4. 这可能是最全的机器学习工具手册!
  5. 医生再添新助手!深度学习诊断传染病 | 完整代码+实操
  6. 2019如何学Python?这里有你需要的答案
  7. 李飞飞宣布成立斯坦福“以人为本AI研究院”
  8. Reddit欲融资3亿美元,由腾讯领投
  9. 从面试角度分析CopyOnWriteArrayList源码
  10. SpringBoot第七篇:springboot开启声明式事务