产品数据库的多种变体

时间:2015-11-15 16:57:24

标签: mysql database-design e-commerce database-schema entity-attribute-value

我知道有很多问题有同样的问题,但我已经经历了这么多答案,但遗憾的是我不理解或可能不满意。

目标 我希望我的产品可以有多个属性,根据他们的组合,他们可以有他们的价格,sku和股票

示例 T-shit产品具有尺寸,颜色和材料属性(选项)

所以我想要这种灵活的结构

  

颜色:红色,尺寸:M,材质:柔软 - >价格1美元,sku XXX,股票3   颜色:红色,尺寸:L,材质:柔软 - >价格2美元,sku XXX,股票4   颜色:黑色,尺寸:XL,材质:硬 - >价格3美元,sKu XXX,股票4

现在我有以下结构,如果只提供一个属性(选项),那就没关系。但它不适合变化(组合)。

产品表

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `brand_id` int(11) DEFAULT NULL,
  `vendor_id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `long_description` longtext COLLATE utf8_unicode_ci NOT NULL,
  `short_description` longtext COLLATE utf8_unicode_ci,
  `images` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `weight` decimal(8,2) NOT NULL,
  `discount` int(11) DEFAULT NULL,
  `discount_start` timestamp NULL DEFAULT NULL,
  `discount_end` timestamp NULL DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  `released_on` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

选项表

CREATE TABLE `options` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Products_Options表

CREATE TABLE `products_options` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  `sku` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `option_id` int(11) DEFAULT NULL,
  `option_value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `unit_price` decimal(8,2) NOT NULL,
  `available_stock` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

因此products_options表可以按以下方式存储产品

Color: Red -> price $1, sku xxx, stock 3
Size: M -> price $1, sku xxx stock 3

但它并不反映我是否想存储颜色:红色尺寸:m有一个价格和sku和库存

由于

2 个答案:

答案 0 :(得分:0)

您应该尝试在产品表中添加price,sku和stock字段。每个唯一产品都具有这些字段中的一个,并且属于产品表。 Please look at the sample db schema.

答案 1 :(得分:0)

您将把产品主要信息和其他信息(大小/颜色)拆分为2个表格。

产品(名称,描述等) - 这适用于所有具有相同规格的产品 - 例如一定范围的袜子......它的"系列&#34 ; - 它不存储任何库存,将其视为空壳。重要的是要注意这里你会区分产品的Womens和Mens版本,并为每个产品创建一个新产品..

ProductsQty :这会列出产品的ID(上图),然后为每个版本添加多行的大小/颜色列 - 如果您说3(尺寸,颜色,重量)例如,你需要3排......(对于非衣服物品更进一步) - 这将是产品的主要规格 - 即中型或大型,或330ml,200w,基本上是什么确定单位的基本尺寸,无论是毫米,毫米,英寸,克,瓦特,伏特......你可以扩展这一点 - 请记住,产品类型将决定两者的分割位置。衣服有颜色和大小,但油箱可能有一升作为主要区别,也可能是一种颜色 - 所以你可以有一个varchar柱,输入任何单位,加仑,英尺,(我使用矩阵1,矩阵2,矩阵3是更通用..)

每种颜色尺寸都需要一个新行..介质中的蓝色袜子与Small中的蓝色袜子不同。

主要功能差异应该是一个新产品 - 即,如果你有一个类似于另一个型号的扬声器设置,但有说 - 额外的蓝牙,这将是一个新的顶级产品..你必须聪明什么时候到分割尺寸/颜色以及何时创建新产品。您只能在第二个表中存储颜色/大小变化,以供您的示例使用。

把它绑起来:

**示例产品:Mens Sierra Dri羽绒服**

产品表(ID,名称,说明):

221,Mens Sierra DriDown全天候夹克,优质3季夹克bla bla

ProductsQty (id,prodid,size,color,qty)

998,221,大,蓝色,22

999,221,大,黑色,4

如果您有多个商店,您可以在新表中使用ProductsQty ID,并为每个子商品提供storeid和qty ..

你也可以将sku存储在任一表中 - 如果家族有相同的sku存储在产品中,如果没有 - 将它放在ProductsQty表中..

现在你可以搜索尺寸/颜色/ sku - 希望这有意义..