愚公系列2022年01月 Django商城項(xiàng)目19-商品數(shù)據(jù)表的設(shè)計(jì)

      網(wǎng)友投稿 712 2022-05-29

      一、SPU、SKU和商品數(shù)據(jù)庫(kù)表設(shè)計(jì)

      在電商項(xiàng)目里面為了準(zhǔn)確的描述商品的區(qū)別,我們抽象出來(lái)兩個(gè)概念,Spu和Sku這兩個(gè)概念。

      1.SPU

      SPU(Standard Product Unit):標(biāo)準(zhǔn)化產(chǎn)品單元。是商品信息聚合的最小單位,是一組可復(fù)用、易檢索的標(biāo)準(zhǔn)化信息的集合,該集合描述了一個(gè)產(chǎn)品的特性。通俗點(diǎn)講,屬性值、特性相同的商品就可以稱(chēng)為一個(gè)SPU。

      2.SKU

      SKU=Stock Keeping Unit(庫(kù)存量單位)。即庫(kù)存進(jìn)出計(jì)量的基本單元,可以是以件,盒,托盤(pán)等為單位。

      3.數(shù)據(jù)庫(kù)設(shè)計(jì)ER圖

      4.模型類(lèi)設(shè)計(jì)

      from django.db import models from utils.models import BaseModel class GoodsCategory(BaseModel): """商品類(lèi)別""" name = models.CharField(max_length=10, verbose_name='名稱(chēng)') parent = models.ForeignKey('self', related_name='subs', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父類(lèi)別') class Meta: db_table = 'tb_goods_category' verbose_name = '商品類(lèi)別' verbose_name_plural = verbose_name def __str__(self): return self.name class GoodsChannelGroup(BaseModel): """商品頻道組""" name = models.CharField(max_length=20, verbose_name='頻道組名') class Meta: db_table = 'tb_channel_group' verbose_name = '商品頻道組' verbose_name_plural = verbose_name def __str__(self): return self.name class GoodsChannel(BaseModel): """商品頻道""" group = models.ForeignKey(GoodsChannelGroup, verbose_name='頻道組名') category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='頂級(jí)商品類(lèi)別') url = models.CharField(max_length=50, verbose_name='頻道頁(yè)面鏈接') sequence = models.IntegerField(verbose_name='組內(nèi)順序') class Meta: db_table = 'tb_goods_channel' verbose_name = '商品頻道' verbose_name_plural = verbose_name def __str__(self): return self.category.name class Brand(BaseModel): """品牌""" name = models.CharField(max_length=20, verbose_name='名稱(chēng)') 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_name def __str__(self): return self.name class SPU(BaseModel): """商品SPU""" name = models.CharField(max_length=50, verbose_name='名稱(chēng)') brand = models.ForeignKey(Brand, on_delete=models.PROTECT, verbose_name='品牌') category1 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat1_spu', verbose_name='一級(jí)類(lèi)別') category2 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat2_spu', verbose_name='二級(jí)類(lèi)別') category3 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat3_spu', verbose_name='三級(jí)類(lèi)別') sales = models.IntegerField(default=0, verbose_name='銷(xiāo)量') comments = models.IntegerField(default=0, verbose_name='評(píng)價(jià)數(shù)') desc_detail = models.TextField(default='', verbose_name='詳細(xì)介紹') desc_pack = models.TextField(default='', verbose_name='包裝信息') desc_service = models.TextField(default='', verbose_name='售后服務(wù)') class Meta: db_table = 'tb_spu' verbose_name = '商品SPU' verbose_name_plural = verbose_name def __str__(self): return self.name class SKU(BaseModel): """商品SKU""" name = models.CharField(max_length=50, verbose_name='名稱(chēng)') caption = models.CharField(max_length=100, verbose_name='副標(biāo)題') spu = models.ForeignKey(SPU, on_delete=models.CASCADE, verbose_name='商品') category = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, verbose_name='從屬類(lèi)別') price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='單價(jià)') cost_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='進(jìn)價(jià)') market_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='市場(chǎng)價(jià)') stock = models.IntegerField(default=0, verbose_name='庫(kù)存') sales = models.IntegerField(default=0, verbose_name='銷(xiāo)量') comments = models.IntegerField(default=0, verbose_name='評(píng)價(jià)數(shù)') is_launched = models.BooleanField(default=True, verbose_name='是否上架銷(xiāo)售') default_image = models.ImageField(max_length=200, default='', null=True, blank=True, verbose_name='默認(rèn)圖片') class Meta: db_table = 'tb_sku' verbose_name = '商品SKU' verbose_name_plural = verbose_name def __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_name def __str__(self): return '%s %s' % (self.sku.name, self.id) class SPUSpecification(BaseModel): """商品SPU規(guī)格""" spu = models.ForeignKey(SPU, on_delete=models.CASCADE, related_name='specs', verbose_name='商品SPU') name = models.CharField(max_length=20, verbose_name='規(guī)格名稱(chēng)') class Meta: db_table = 'tb_spu_specification' verbose_name = '商品SPU規(guī)格' verbose_name_plural = verbose_name def __str__(self): return '%s: %s' % (self.spu.name, self.name) class SpecificationOption(BaseModel): """規(guī)格選項(xiàng)""" spec = models.ForeignKey(SPUSpecification, related_name='options', on_delete=models.CASCADE, verbose_name='規(guī)格') value = models.CharField(max_length=20, verbose_name='選項(xiàng)值') class Meta: db_table = 'tb_specification_option' verbose_name = '規(guī)格選項(xiàng)' verbose_name_plural = verbose_name def __str__(self): return '%s - %s' % (self.spec, self.value) class SKUSpecification(BaseModel): """SKU具體規(guī)格""" sku = models.ForeignKey(SKU, related_name='specs', on_delete=models.CASCADE, verbose_name='sku') spec = models.ForeignKey(SPUSpecification, on_delete=models.PROTECT, verbose_name='規(guī)格名稱(chēng)') option = models.ForeignKey(SpecificationOption, on_delete=models.PROTECT, verbose_name='規(guī)格值') class Meta: db_table = 'tb_sku_specification' verbose_name = 'SKU規(guī)格' verbose_name_plural = verbose_name def __str__(self): return '%s: %s - %s' % (self.sku, self.spec.name, self.option.value) class GoodsVisitCount(BaseModel): """統(tǒng)計(jì)分類(lèi)商品訪問(wèn)量模型類(lèi)""" category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='商品分類(lèi)') count = models.IntegerField(verbose_name='訪問(wèn)量', default=0) date = models.DateField(auto_now_add=True, verbose_name='統(tǒng)計(jì)日期') class Meta: db_table = 'tb_goods_visit' verbose_name = '統(tǒng)計(jì)分類(lèi)商品訪問(wèn)量' verbose_name_plural = verbose_name

      二、首頁(yè)廣告數(shù)據(jù)庫(kù)表設(shè)計(jì)

      1.數(shù)據(jù)庫(kù)設(shè)計(jì)ER圖

      2.模型類(lèi)設(shè)計(jì)

      from django.db import models from utils.models import BaseModel # Create your models here. class ContentCategory(BaseModel): """廣告內(nèi)容類(lèi)別""" name = models.CharField(max_length=50, verbose_name='名稱(chēng)') key = models.CharField(max_length=50, verbose_name='類(lèi)別鍵名') class Meta: db_table = 'tb_content_category' verbose_name = '廣告內(nèi)容類(lèi)別' verbose_name_plural = verbose_name def __str__(self): return self.name class Content(BaseModel): """廣告內(nèi)容""" category = models.ForeignKey(ContentCategory, on_delete=models.PROTECT, verbose_name='類(lèi)別') title = models.CharField(max_length=100, verbose_name='標(biāo)題') url = models.CharField(max_length=300, verbose_name='內(nèi)容鏈接') image = models.ImageField(null=True, blank=True, verbose_name='圖片') text = models.TextField(null=True, blank=True, verbose_name='內(nèi)容') sequence = models.IntegerField(verbose_name='排序') status = models.BooleanField(default=True, verbose_name='是否展示') class Meta: db_table = 'tb_content' verbose_name = '廣告內(nèi)容' verbose_name_plural = verbose_name def __str__(self): return self.category.name + ': ' + self.title

      總結(jié)

      商品數(shù)據(jù)庫(kù)涉及要細(xì)分不變項(xiàng)和可變項(xiàng)的設(shè)計(jì),一對(duì)一,多對(duì)多,一對(duì)多關(guān)聯(lián)要盡可能細(xì)分,對(duì)于不確定的信息可以有json形式存儲(chǔ)。對(duì)于訪問(wèn)量特別大的頁(yè)面可以進(jìn)行mongodb存儲(chǔ),mongodb對(duì)于存儲(chǔ)文檔數(shù)據(jù)庫(kù)是個(gè)很好的選擇,庫(kù)存秒殺的情況redis和mq消息隊(duì)列也是必不可少,冪函數(shù)等等。

      【愚公系列】2022年01月 Django商城項(xiàng)目19-商品數(shù)據(jù)表的設(shè)計(jì)

      Django 數(shù)據(jù)庫(kù)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:原來(lái)酷炫的大屏,用Excel就能做!
      下一篇:Java---實(shí)現(xiàn)運(yùn)行任意目錄下class中加了@MyTest的空參方法(實(shí)現(xiàn)圖形界面)
      相關(guān)文章
      亚洲AV无码国产剧情| 亚洲人成www在线播放| 亚洲aⅴ无码专区在线观看春色 | 亚洲成av人片不卡无码| 亚洲午夜精品久久久久久人妖| 亚洲人成网7777777国产| 国产专区一va亚洲v天堂| 精品亚洲一区二区三区在线观看 | 亚洲人成网站在线播放影院在线 | 国产精品亚洲自在线播放页码| 亚洲日本国产乱码va在线观看| 91在线亚洲精品专区| 亚洲综合无码一区二区| 久久精品蜜芽亚洲国产AV| 久久99亚洲网美利坚合众国| 亚洲国产精品久久久久久| 麻豆亚洲AV永久无码精品久久| 色婷婷亚洲十月十月色天| 久久丫精品国产亚洲av| 亚洲色图视频在线观看| 亚洲日韩乱码久久久久久| 亚洲人成在线播放| 亚洲最大中文字幕无码网站 | 亚洲偷偷自拍高清| 亚洲国产精品嫩草影院| 久久亚洲色WWW成人欧美| www.亚洲一区| 亚洲色中文字幕无码AV| 亚洲gv猛男gv无码男同短文| 亚洲国产精品久久久久网站| 久久精品国产亚洲av日韩| 亚洲人成片在线观看| 亚洲中文字幕乱码一区| 韩国亚洲伊人久久综合影院| 亚洲精品亚洲人成在线观看下载| 在线a亚洲v天堂网2019无码| 亚洲AV无码一区二区二三区入口| 久久久国产精品亚洲一区| 亚洲AV无码国产精品色| 亚洲精品成a人在线观看☆| 小说专区亚洲春色校园|