精华内容
下载资源
问答
  • 因为我们向客户展示的是商品的名字,还有他的分类,所以我们需要这两个参数来帮我们去让客户更好的了解这个商品。 SPU,指的是一组有共同属性的商品。这个该怎么去理解呢?你可以看看最上面那个红框圈住的地方,这是...

    什么是SPU?什么是SKU?

    我们做电商网站有两个概念,特别要清楚,就是商品规格参数里面的SPU和SKU。为什么要熟悉这两个呢?因为商品的种类繁多,我们要去储存商品信息的话,就需要用商品数据结构方法去储存,其中要涉及到SPU跟SKU。我们用京东的小米手机为例子,为什么我们需要这两个参数呢?因为我们向客户展示的是商品的名字,还有他的分类,所以我们需要这两个参数来帮我们去让客户更好的了解这个商品。

    SPU,指的是一组有共同属性的商品。这个该怎么去理解呢?你可以看看最上面那个红框圈住的地方,这是一个标题,也代表了所有的小米8商品的集合,他们都有着共同的属性,共同的属性就写在这个标题里面了。所以这就是SPU

    SKU,指的是商品集因具体属性不同而细分的每个商品。举个例子,就是下面红框的地方,一堆有共同属性的商品小米8聚集在一起,他们虽然有共同属性,但是细分下来他们也有许多细节上的不同。比如颜色不同,内存不同,购买方式不同。这就是因具体属性不同而细分的商品,这就是SKU。
    在这里插入图片描述
    而且我们要想好做一个什么样的分类,不同的商品之间肯定有东西不同,比如说我这个只是一个手机的商品,他的SKU肯定会和其他比如日用品类商品不同,日用品没有多少内存这么算的,所以这个分类的逻辑要清楚。而且在选择SKU的时候,如果你选择颜色分类为黑色,那么商品的图片,也会跟着变为黑色,选择颜色分类为金色,图片也会变成金色,这个也是有一定关联的。

    在这里插入图片描述
    而且在这些规格参数里面,有些值是固定不变的,比如商品的型号,品牌等等,这些我们可以设定为固定值,但是商品机型的颜色,会根据SKU的改变而改变,这也是我们要注意编写的业务逻辑。

    在这里插入图片描述
    还有这部分的参数,是根据商品的类别设定的,如果是日用品类,根本就没有这些参数。

    所以我们做一个电商网站的时候,提前观察好他有什么页面,有哪些参数等等。

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    来看看这个关系图,这个关系图说的就是你用户输入什么商品,我就会给你一个怎么样的参数,什么样的参数就会对应什么样的参数表。如果不懂的话可以看下图。一个商品对应多个参数组,一个参数组对应多个参数表,能明白这个关系吗?比如我是一个苹果手机,我一个苹果手机是不是对应多个参数组,参数组里面分别有内存参数组,版本参数组,购买方式参数组。一个参数组又对应多个参数表,比如我的内存选择了64g,那么我的参数表是不是整个都变化了?我的参数表里面有机身颜色,内存大小,等等参数。看看上图,为什么参数表里面有跟参数组一样的cid,cid是什么?这个是一个商品,有一样的cid是因为页面上面中,我输入一样东西,马上会出现这些商品参数表,如果我还要去商品参数组里面去获取这些参数表,那无疑就拖慢了速度,所以我可以直接用商品来关联参数表。

    category分列表不用怎么介绍,就是你输入框里面输入什么商品就是这个列表里面的
    在这里插入图片描述
    上面的是参数组
    在这里插入图片描述
    上面的是参数表

    有一些参数我们是一样的,比如下面这个,我们要确定他是否是通用值,如果是通用值,那是SPU的,如果不是通用值,那就跟SKU。这是为什么呢?因为不是通用值的话,那肯定是SKU改变了。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 【笔记】商品表设计

    2021-03-08 19:29:55
    // 树形品类维护 CREATE TABLE `category` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(11) unsigned NOT NULL COMMENT '父Id', `name` varchar(200) COLLATE utf8mb4_unicode_ci NOT ...
    
    // 树形品类维护表
    CREATE TABLE `category` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `parent_id` int(11) unsigned NOT NULL COMMENT '父Id',
      `name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分类名称',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`),
      KEY `idx_ctm` (`create_time`)
    ) ENGINE=InnoDB AUTO_INCREMENT=693 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品分类表'
    
    // 品类属性KEY
    CREATE TABLE `attribute_key` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `category_id` int(11) unsigned NOT NULL COMMENT '分类Id',
      `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '规格名称',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uidx_ctd_name` (`category_id`,`name`),
      KEY `idx_ctm` (`create_time`)
    ) ENGINE=InnoDB AUTO_INCREMENT=298 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类之规格表组key'
    
    // 属性具体VALUE枚举表
    CREATE TABLE `attribute_value` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `attribute_id` int(11) unsigned NOT NULL COMMENT '规格Id',
      `name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名称',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`),
      KEY `idx_atd` (`attribute_id`),
      KEY `idx_ctm` (`create_time`)
    ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类之规格组内属性'
    
    
    // 商品类目表
    CREATE TABLE `product` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品名称',
      `product_desc` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品描述',
      `supplier_id` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '供应商Id',
      `category_id` int(11) unsigned NOT NULL COMMENT '分类Id',
      `status` tinyint(3) NOT NULL DEFAULT '1' COMMENT '0 无效 1 正常',
      `source` int(11) NOT NULL DEFAULT '1' COMMENT '来源 1 运营录入',
      `attribute_list` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '商品规格详情json ',
      `body` varchar(2000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '商品详细展示结构,json图文介绍',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`),
      KEY `idx_spd` (`supplier_id`),
      KEY `idx_cid` (`category_id`),
      KEY `idx_ctm` (`create_time`)
    ) ENGINE=InnoDB AUTO_INCREMENT=714 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品-spu'
    
    
    // 商品类目表
    CREATE TABLE `sku` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `product_id` int(11) unsigned NOT NULL COMMENT '商品Id',
      `sku_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'sku单品名称',
      `sku_code` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'sku单品code  按规则排序存储 ',  // 600张65*65mm
      `sku_price` int(11) NOT NULL DEFAULT '1' COMMENT '单品价格',
      `sku_stock` int(11) NOT NULL DEFAULT '10000000' COMMENT '单品库存',
      `attribute_list` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',  // 比如 {"period":92,"firstBuyPrice":2200} 比如 {"颜色":"500张65*65mm"}
      `status` tinyint(3) NOT NULL DEFAULT '1' COMMENT '0 下架 1 正常 ',
      `source` int(11) NOT NULL DEFAULT '1' COMMENT '来源 1 运营录入',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `idx_pid_sku` (`product_id`,`sku_code`),
      KEY `idx_ctm` (`create_time`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1008 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='单品sku'
    
    
    // 订单表
    CREATE TABLE `biz_order` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `biz_order_no` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '业务订单ID',
      `pay_order_no` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '支付订单ID',
      `address` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户地址',
      `buyer_open_id` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '购买者',
      `seller_open_id` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '销售者',
      `order_status` int(11) NOT NULL COMMENT '(1,"待支付"), (2,"支付中"), (3,"支付成功/未发货"), (4,"打款成功"), (5,"已退款")(6,"待打款,运营填完快递信息的状态")',
      `from_open_id` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '邀请人',
      `from_biz_id` bigint(11) DEFAULT NULL COMMENT '来源信息',
      `from_biz_type` int(11) DEFAULT NULL COMMENT '来源类型1:app,2:小城,
      `total_amount` int(11) NOT NULL COMMENT '购买总金额',
      `item_title` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品名称',
      `item_amount` int(11) NOT NULL COMMENT '单价',
      `total_count` int(11) NOT NULL COMMENT '购买数量',
      `actual_amount` int(11) NOT NULL COMMENT '支付金额',
      `biz_id` bigint(11) DEFAULT NULL COMMENT '关联业务',
      `biz_product_id` bigint(11) unsigned DEFAULT '0' COMMENT '关联业务产品id',
      `biz_type` int(11) DEFAULT NULL COMMENT '关联业务类型',
      `coupon_id` int(11) DEFAULT NULL COMMENT '优惠券信息',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      UNIQUE KEY `idx_order_no` (`biz_order_no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6850 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    
    
    
    

     

    展开全文
  • 摘要: 电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息,内容翻译自User case - ...

    摘要: 电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息,内容翻译自User case - Product Catalog 关系型数据库解决方案 上述问题使用传统的关系型数据库也可以解决,比如以下几种方案 针对不同商品,创建不同的表 比如音乐专辑、电影这2种商品,有一部分共同的属性,但也有很多自身特有的属性,可以创建2个不同的表,拥有不同的schema。

    电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息,内容翻译自User case - Product Catalog

    关系型数据库解决方案

    上述问题使用传统的关系型数据库也可以解决,比如以下几种方案

    针对不同商品,创建不同的表

    比如音乐专辑、电影这2种商品,有一部分共同的属性,但也有很多自身特有的属性,可以创建2个不同的表,拥有不同的schema。

    CREATE TABLE `product_audio_album` (
        `sku` char(8) NOT NULL,
        ...
        `artist` varchar(255) DEFAULT NULL,
        `genre_0` varchar(255) DEFAULT NULL,
        `genre_1` varchar(255) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`))
    ...
    CREATE TABLE `product_film` (
        `sku` char(8) NOT NULL,
        ...
        `title` varchar(255) DEFAULT NULL,
        `rating` char(8) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`))
    ...
    

    这种做法的主要问题在于

    • 针对每个新的商品分类,都需要创建新的表
    • 应用程序开发者必须显式的将请求分发到对应的表上来查询,一次查询多种商品实现起来比较麻烦

    所有商品存储到单张表

    CREATE TABLE `product` (
        `sku` char(8) NOT NULL,
        ...
        `artist` varchar(255) DEFAULT NULL,
        `genre_0` varchar(255) DEFAULT NULL,
        `genre_1` varchar(255) DEFAULT NULL,
        ...
        `title` varchar(255) DEFAULT NULL,
        `rating` char(8) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`))
        

    将所有的商品存储到一张表,这张表包含所有商品需要的属性,不同的商品根据需要设置不同的属性,这种方法使得商品查询比较简单,并且允许一个查询跨多种商品,但缺点是浪费的空间比较多。

    提取公共属性,多表继承

    CREATE TABLE `product` (
        `sku` char(8) NOT NULL,
        `title` varchar(255) DEFAULT NULL,
        `description` varchar(255) DEFAULT NULL,
        `price`, ...
        PRIMARY KEY(`sku`))
    
    CREATE TABLE `product_audio_album` (
        `sku` char(8) NOT NULL,
        ...
        `artist` varchar(255) DEFAULT NULL,
        `genre_0` varchar(255) DEFAULT NULL,
        `genre_1` varchar(255) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`),
        FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
    ...
    CREATE TABLE `product_film` (
        `sku` char(8) NOT NULL,
        ...
        `title` varchar(255) DEFAULT NULL,
        `rating` char(8) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`),
        FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
    ...
    

    上述方案将所有商品公共的属性提取出来,将公共属性存储到一张表里,每种商品根据自身的需要创建新的表,新表里只存储该商品特有的信息。

    Entity Attribute Values 形式存储

    所有的数据按照<商品SKU, 属性、值> 的3元组的形式存储,这个方案实际上是把关系型数据库当KV存储使用,模型简单,但应对复杂的查询不是很方便。

    Entity Attribute Values
    sku_00e8da9b type Audio Album
    sku_00e8da9b title A Love Supreme
    sku_00e8da9b ... ...
    sku_00e8da9b artist John Coltrane
    sku_00e8da9b genre Jazz
    sku_00e8da9b genre General
    ... ... ...

    MongoDB 解决方案

    MognoDB 与关系型数据库不同,其无schema,文档内容可以非常灵活的定制,能很好的使用上述商品分类存储的需求; 将商品信息存储在一个集合里,集合里不同的商品可以自定义文档内容。

    比如一个音乐专辑可以类似如下的文档结构

    {
      sku: "00e8da9b",
      type: "Audio Album",
      title: "A Love Supreme",
      description: "by John Coltrane",
      asin: "B0000A118M",
    
      shipping: {
        weight: 6,
        dimensions: {
          width: 10,
          height: 10,
          depth: 1
        },
      },
    
      pricing: {
        list: 1200,
        retail: 1100,
        savings: 100,
        pct_savings: 8
      },
    
      details: {
        title: "A Love Supreme [Original Recording Reissued]",
        artist: "John Coltrane",
        genre: [ "Jazz", "General" ],
            ...
        tracks: [
          "A Love Supreme Part I: Acknowledgement",
          "A Love Supreme Part II - Resolution",
          "A Love Supreme, Part III: Pursuance",
          "A Love Supreme, Part IV-Psalm"
        ],
      },
    }
    

    而一部电影则可以存储为

    {
      sku: "00e8da9d",
      type: "Film",
      ...,
      asin: "B000P0J0AQ",
    
      shipping: { ... },
    
      pricing: { ... },
    
      details: {
        title: "The Matrix",
        director: [ "Andy Wachowski", "Larry Wachowski" ],
        writer: [ "Andy Wachowski", "Larry Wachowski" ],
        ...,
        aspect_ratio: "1.66:1"
      },
    }
    

    所有商品都拥有一些共同的基本信息,特定的商品可以根据需要扩展独有的内容,非常方便; 基于上述模型,MongoDB 也能很好的服务各类查询。

    查询某个演员参演的所有电影,并按发型日志排序

    
    db.products.find({'type': 'Film', 'details.actor': 'Keanu Reeves'}).sort({'details.issue_date', -1})
    

    上述查询也可以通过建立索引来加速

    db.products.createIndex({ type: 1, 'details.actor': 1, 'details.issue_date': -1 })
    

    查询标题里包含特定信息的所有电影

    db.products.find({
        'type': 'Film',
        'title': {'$regex': '.*hacker.*', '$options':'i'}}).sort({'details.issue_date', -1})
    

    可建立如下索引来加速查询

     db.products.createIndex({ type: 1, details.issue_date: -1, title: 1 })
    

    扩展

    当单个节点无法满足海量商品信息存储的需求时,就需要使用MongoDB sharding来扩展,假定大量的查询都是都会基于商品类型,那么就可以使用商品类型字段来进行分片。

    db.shardCollection('products', { key: {type: 1} })
    

    分片时,尽量使用复合的索引字段,这样能满足更多的查询需求,比如基于商品类型之后,还会经常根据商品的风格标签来查询,则可以把商品的标签字段作为第二分片key。

    db.shardCollection('products', { key: {type: 1, 'details.genre': 1} })
    

    如果某种类型的商品,拥有相同标签的特别多,则会出现jumbo chunk的问题,导致无法迁移,可以进一步的优化分片key,以避免这种情况。

    
    db.shardCollection('products', { key: {type: 1, 'details.genre': 1, sku: 1} })
    

    加入第3分片key之后,即使类型、风格标签都相同,但其sku信息肯定不同,就肯定不会出现超大的chunk。

    原文地址:https://yq.aliyun.com/articles/68419?spm=5176.100239.blogcont73664.25.h8eZaz

    展开全文
  • 【摘要】电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息,内容翻译自User case - ...

    【摘要】电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息,内容翻译自User case - Product Catalog 关系型数据库解决方案 上述问题使用传统的关系型数据库也可以解决,比如以下几种方案 针对不同商品,创建不同的表 比如音乐专辑、电影这2种商品,有一部分共同的属性,但也有很多自身特有的属性,可以创建2个不同的表,拥有不同的schema。

    电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息,内容翻译自User case - Product Catalog

    关系型数据库解决方案

    上述问题使用传统的关系型数据库也可以解决,比如以下几种方案:

    针对不同商品,创建不同的表

    比如音乐专辑、电影这2种商品,有一部分共同的属性,但也有很多自身特有的属性,可以创建2个不同的表,拥有不同的schema。

    CREATE TABLE `product_audio_album` (
        `sku` char(8) NOT NULL,
        ...
        `artist` varchar(255) DEFAULT NULL,
        `genre_0` varchar(255) DEFAULT NULL,
        `genre_1` varchar(255) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`))
    ...
    CREATE TABLE `product_film` (
        `sku` char(8) NOT NULL,
        ...
        `title` varchar(255) DEFAULT NULL,
        `rating` char(8) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`))
    ...

    这种做法的主要问题在于:

    • 针对每个新的商品分类,都需要创建新的表
    • 应用程序开发者必须显式的将请求分发到对应的表上来查询,一次查询多种商品实现起来比较麻烦

    所有商品存储到单张表

    CREATE TABLE `product` (
        `sku` char(8) NOT NULL,
        ...
        `artist` varchar(255) DEFAULT NULL,
        `genre_0` varchar(255) DEFAULT NULL,
        `genre_1` varchar(255) DEFAULT NULL,
        ...
        `title` varchar(255) DEFAULT NULL,
        `rating` char(8) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`))

    将所有的商品存储到一张表,这张表包含所有商品需要的属性,不同的商品根据需要设置不同的属性,这种方法使得商品查询比较简单,并且允许一个查询跨多种商品,但缺点是浪费的空间比较多。

    提取公共属性,多表继承

    CREATE TABLE `product` (
        `sku` char(8) NOT NULL,
        `title` varchar(255) DEFAULT NULL,
        `description` varchar(255) DEFAULT NULL,
        `price`, ...
        PRIMARY KEY(`sku`))
    
    CREATE TABLE `product_audio_album` (
        `sku` char(8) NOT NULL,
        ...
        `artist` varchar(255) DEFAULT NULL,
        `genre_0` varchar(255) DEFAULT NULL,
        `genre_1` varchar(255) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`),
        FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
    ...
    CREATE TABLE `product_film` (
        `sku` char(8) NOT NULL,
        ...
        `title` varchar(255) DEFAULT NULL,
        `rating` char(8) DEFAULT NULL,
        ...,
        PRIMARY KEY(`sku`),
        FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
    ...

    上述方案将所有商品公共的属性提取出来,将公共属性存储到一张表里,每种商品根据自身的需要创建新的表,新表里只存储该商品特有的信息。

    Entity Attribute Values形式存储

    所有的数据按照<商品SKU, 属性、值> 的3元组的形式存储,这个方案实际上是把关系型数据库当KV存储使用,模型简单,但应对复杂的查询不是很方便。

    Entity Attribute Values
    sku_00e8da9b type Audio Album
    sku_00e8da9b title A Love Supreme
    sku_00e8da9b
    sku_00e8da9b artist John Coltrane
    sku_00e8da9b genre Jazz
    sku_00e8da9b genre General

    MongoDB解决方案

    MognoDB 与关系型数据库不同,其无schema,文档内容可以非常灵活的定制,能很好的使用上述商品分类存储的需求; 将商品信息存储在一个集合里,集合里不同的商品可以自定义文档内容。

    比如一个音乐专辑可以类似如下的文档结构:

    {
      sku: "00e8da9b",
      type: "Audio Album",
      title: "A Love Supreme",
      description: "by John Coltrane",
      asin: "B0000A118M",
    
      shipping: {
        weight: 6,
        dimensions: {
          width: 10,
          height: 10,
          depth: 1
        },
      },
    
      pricing: {
        list: 1200,
        retail: 1100,
        savings: 100,
        pct_savings: 8
      },
    
      details: {
        title: "A Love Supreme [Original Recording Reissued]",
        artist: "John Coltrane",
        genre: [ "Jazz", "General" ],
            ...
        tracks: [
          "A Love Supreme Part I: Acknowledgement",
          "A Love Supreme Part II - Resolution",
          "A Love Supreme, Part III: Pursuance",
          "A Love Supreme, Part IV-Psalm"
        ],
      },
    }

    而一部电影则可以存储为:

    {
      sku: "00e8da9d",
      type: "Film",
      ...,
      asin: "B000P0J0AQ",
    
      shipping: { ... },
    
      pricing: { ... },
    
      details: {
        title: "The Matrix",
        director: [ "Andy Wachowski", "Larry Wachowski" ],
        writer: [ "Andy Wachowski", "Larry Wachowski" ],
        ...,
        aspect_ratio: "1.66:1"
      },
    }

    所有商品都拥有一些共同的基本信息,特定的商品可以根据需要扩展独有的内容,非常方便; 基于上述模型,MongoDB 也能很好的服务各类查询。

    查询某个演员参演的所有电影,并按发型日志排序:

    db.products.find({'type': 'Film', 'details.actor': 'Keanu Reeves'}).sort({'details.issue_date', -1})

    上述查询也可以通过建立索引来加速:

    db.products.createIndex({ type: 1, 'details.actor': 1, 'details.issue_date': -1 })

    查询标题里包含特定信息的所有电影:

    db.products.find({
        'type': 'Film',
        'title': {'$regex': '.*hacker.*', '$options':'i'}}).sort({'details.issue_date', -1})

    可建立如下索引来加速查询

    db.products.createIndex({ type: 1, details.issue_date: -1, title: 1 })

    扩展

    当单个节点无法满足海量商品信息存储的需求时,就需要使用MongoDB sharding来扩展,假定大量的查询都是都会基于商品类型,那么就可以使用商品类型字段来进行分片。

    db.shardCollection('products', { key: {type: 1} })

    分片时,尽量使用复合的索引字段,这样能满足更多的查询需求,比如基于商品类型之后,还会经常根据商品的风格标签来查询,则可以把商品的标签字段作为第二分片key。

    db.shardCollection('products', { key: {type: 1, 'details.genre': 1} })

    如果某种类型的商品,拥有相同标签的特别多,则会出现jumbo chunk的问题,导致无法迁移,可以进一步的优化分片key,以避免这种情况。

    db.shardCollection('products', { key: {type: 1, 'details.genre': 1, sku: 1} })

    加入第3分片key之后,即使类型、风格标签都相同,但其sku信息肯定不同,就肯定不会出现超大的chunk。

    作者:张友东,花名林青,阿里云数据库组技术专家,主要关注分布式存储、NoSQL数据库等技术领域,目前主要参与MongoDB云数据库的研发,致力于让开发者用上最好的MongoDB云服务。

    展开全文
  • 最新淘宝后台全品类商品分类明细名表,后台sku类目树设计,包含一级分类、二级分类、三级分类、四级分类和五级分类
  • 2019最新淘宝后台全品类商品分类明细名表,后台sku类目树设计,包含标题,id,具体url资源
  • 一致性维度 设计思路

    千次阅读 2019-07-22 20:08:18
    沉淀出通用的维度属性 (需要复杂运算得到,比如商品的三级分类名称,需要JOIN品类表得到 category3 name) 2、维度设计步骤 确定主维度 (例如商品) 确定相关维商品相关的类目、卖家、店铺相关维) ...
  • SAP 主数据-地点

    2019-10-08 08:27:19
    WREFA :地点与参考店对应 T001W:地点 ...WRF3:地点商品品类一级供货地点 TVTW:分销渠道 WRF1:地点的库存管理 WRF6:地点与商品分类对应 转载于:https://www.cnblogs.com/byfhd/archiv...
  • 1)每个分类都设计一张(那么几十万种商品设计几十万张表???) 2)全都放在一张中,多一类就添加属性(属性基本上都不一样,那要写多少属性???) 显然上面两种方案都是不可取的,那么该如何设计呢? 一类...
  • 需求:类似于美团的商家页面,左边是可点击选择的商品品类,右边是按各商品品类分类的商品列表。点击左边某品类时,右边商品列表自动滚动定位到该品类下商品第一个;滚动右边商品列表时,当滚动到某个品类名时自动...
  • goods_detail.sql

    2020-03-27 16:39:31
    淘宝后台全品类商品分类明细名表。包含类目ID,类目名称,下下级关系,类目级别,path,pathid。
  • DWD 层分析 DWD 层的作用是对 ODS 层的数据进行清洗,但因为...即为商品表增加 6 列,分别存放一二三级品类的名称和 ID,并删除三张分类表。 DWD 层创建 在 DWD 层,基本保留所有表,然后减少分类表,并入到商品表...
  • 电子商务产品属性结构设计

    千次阅读 2012-11-28 14:39:02
    问题: 不同产品的属性不一样,...现设计几个表:产品表、产品分类表、属性组表、属性基础表、品类与属性组表   【产品表】:存放产品档案,字段有产品ID、产品名称、产品描述等 【产品分类表】:存放产品的所有分
  • 数仓分层总结

    2020-07-28 22:49:34
    商品表+品类表+SPU+三级分类+二级分类+一级分类=》商品表 省份+地区=》地区―活动+活动规则=》活动 好处:减少后续大量JOIN操作。 (2)数据清洗(ETL)专门的岗位,hive sql 、MR、Python、Kettle、...
  • Data too long

    2018-11-30 07:27:53
    场景 A :用户优惠券,券会存在适用的商品品类,但是建立券的时候却要勾选商品的大的分类(包含一批的商品分类);商品数据不断扩充,就会出现优惠券中存放商品分类字段不够用的情况; 场景 B: 财务流水记录,...
  • 5张表格教会你优化B2C盈利   摸清商品结构  小丁他们得到一笔投资,创建一个区域综合B2C... 这是一份商品分类分维度的表格,比如花生属于坚果这个品类,花生有味道、外形、规格、价格等多个维度。它能帮助我...
  • 需求:搜索商品,首先根据关键字(品名,材质,规格,钢厂,仓库,公司名)进行模糊查询,需要返回筛选条件,返回的筛选条件为品类,品名(多选),材质(多选),钢厂(多选)。然后根据品类,品名,材质,钢厂,地区,在一次进行精确搜索。...
  • 同时提供了对品类、货品、结算类型、供应商、业务主管、业务代表、经营单品的销售、成本、政策返利、经营费用、供应商返补的分类分析。 参见:http://blog.vsharing.com/foresun/A626306.html。当前功能要比参见资料...

空空如也

空空如也

1
收藏数 20
精华内容 8
关键字:

商品品类分类表