• 商城 商品模块 数据库 表设计



    表关系:
    分类表 <= 商品表 <= SKU表(库存表)
    分类表 <= 属性名 <= 属性值
    商品表 <= 商品和属性关系表 => 属性名|属性值

    业务逻辑:
    1.同一商品不同SKU库存和售价不同.
    2.不同类型的商品具有不同的属性名和属性值(如汽车和服饰),所以属性需要支持后期添加和维护.
    3.在某个商品分类下通过属性筛选商品.
    4.商家某件商品的销量统计,该件商品内几个不同SKU的销量统计.
    5.更多...

    分类表:
    (商品分类编号, 分类名称, 父分类编号)
    (1, 男装, 0)
    (2, 裤子, 1)
    (3, 外套, 1)
    (4, 内裤, 1)
    (5, 袜子, 1)
    
    商品表:
    (商品编号, 商品名称, 商品分类编号, 卖家编号, SPU销量, 评论数)
    (1, '裤子名', 2, 1, 0)
    (2, '外套名', 3, 1, 0)
    (3, '内裤名', 4, 1, 0)
    (4, '袜子名', 5, 1, 0)
    
    SKU表(库存表):
    (SKU编号, 商品编号, SKU属性, 价格, 库存, SKU销量)
    (1, 1, [1:1,2:3], 99, 400, 0) 其中 [1:1,2:3] 表示 "颜色为黑色,尺码为X"
    (2, 1, [1:1,2:4], 99, 200, 0) 其中 [1:1,2:4] 表示 "颜色为黑色,尺码为XL"
    (3, 1, [1:2,2:3], 99, 300, 0) 其中 [1:2,2:3] 表示 "颜色为白色,尺码为X"
    (4, 1, [1:2,2:4], 99, 100, 0) 其中 [1:2,2:4] 表示 "颜色为白色,尺码为XL"
    上面只列出商品1这个分类的4个SKU.
    
    属性名:
    (属性名编号, 属性名, 商品分类编号, 父属性编号)
    (1, 颜色, 2, 0)
    (2, 尺码, 2, 0)
    (3, 品牌, 2, 0)
    上面只列出裤子这个分类的3个属性名.
    
    属性值:
    (属性值编号, 属性值, 属性名编号)
    (1, 黑色, 1)
    (2, 白色, 1)
    (3, X,  2)
    (4, XL, 2)
    (5, 七匹狼, 3)
    (6, 九牧王, 3)
    上面只列出裤子这个分类的6个属性值.
    
    商品和属性关系表:
    (自增编号, 商品编号, 属性名编号, 属性值编号)
    (1, 1, 1, 1) 商品1颜色为黑色
    (2, 1, 1, 2) 商品1颜色为白色
    (3, 1, 2, 3) 商品1尺码为X
    (4, 1, 2, 4) 商品1尺码为XL
    上面只列出商品1的4个属性关系.
    
    商品和属性筛选表:
    (商品编号, 商品具有的属性值编号)
    (1, [1,2,3,4])
    用SQL全文检索实现筛选.
    如:
    select * from 商品表 
    inner join 商品和属性筛选表 
    on 商品表.商品编号 = 商品和属性筛选表.商品编号
    where 商品表.商品分类编号 = 2 
    and 商品和属性筛选表.商品具有的属性值编号 MATCH '1 3'
    order by 商品表.评论数 DESC LIMIT 10 OFFSET 20;
    
    商品搜索表:
    (商品编号, 商品标题和内容)
    (1, [无需词典,二元分词])
    用SQL全文检索实现搜索.

    里面有这么一些表结构设计思想:
    名值: id, name, value (用于实现自定义字段如属性的存储)
    父子: id, pid (用于实现关系树如分类和子分类的存储)
    其中"名值"的思想应该就是EAV(Entity-Attribute-Value)实体属性值模型思想.
    留意过WordPress数据表的也会看到类似设计:
    wp_postmeta(meta_id,post_id,meta_key,meta_value)
    wp_commentmeta(meta_id,comment_id,meta_key,meta_value)
    wp_usermeta(umeta_id,user_id,meta_key,meta_value)
    wp_options(option_id,option_name,option_value,autoload)
    "父子"存储无限极分类:
    wp_term_taxonomy(term_taxonomy_id,term_id,taxonomy,parent)

    上面提到的无需词典的二元分次算法示例:

    <?php
    function cws($str) {
        //找出字符串中的英文单词和数字
        if(preg_match_all('%[A-Za-z0-9_-]{1,}%', $str, $matches)) {
            $arr = $matches[0];
        }
        //以非中文(中文包括简体和繁体)进行正则分割
        $sections = preg_split('%[^x{4e00}-x{9fa5}]{1,}%u', $str);
        foreach($sections as $v) {
            //注意:foreach中多次正则匹配会降低性能
            switch(true) {
                case ($v === ''): continue; break;
                case (mb_strlen($v, 'UTF-8') < 3): $arr[] = $v; break;
                case (preg_match_all('%[x{4e00}-x{9fa5}]%u', $v, $matches)):
                    //前后俩俩组合,实现冗余分词.
                    //如"中国好声音"将被分词为: 中国 国好 好声 声音
                    $size = count($matches[0]);
                    for($i = 0; $i <= $size-2; $i++) {
                        $word = '';
                        for($j = 0; $j < 2; $j++) {
                            $word .= $matches[0][$i+$j]; //echo $i.' '.$j.' '.$matches[0][$i+$j]."
    ";
                        }
                        $arr[] = $word; //echo "
    ";
                    }
                    break;
            }
        }
        return array_unique($arr);
    }
  • 相关阅读:
    Java 21-Spring知识
    Java18-黑马旅游网学习制作
    Java17-Filter&Listener&Json&redis&maven
    python发邮件
    一元模型拟合(OLS和插值np拟合)
    一元模型拟合
    2.13 描述性统计(平均数,中位数,中数,数据的离散度(极差,平均绝对偏差,方差标准差))
    tushare 股票数据获取,收益率计算,直方图绘制
    主板指数数据的爬取(selenium处理JS)
    网页整页截图小工具
  • 原文地址:https://www.cnblogs.com/xunianchong/p/8604167.html
Copyright © 2020-2023  润新知