elasticsearch入門(mén)系列">elasticsearch入門(mén)系列
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ù)等等。
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)容。