Mysql 产品数据库的多种变体

Mysql 产品数据库的多种变体,mysql,database-design,e-commerce,database-schema,entity-attribute-value,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 现在,如果只提供了一个属性(

我知道有很多问题都有同样的担忧,但我已经找到了很多答案,但不幸的是我不理解或者可能不满意

目标 我希望我的产品可以有多个属性,并根据它们的组合,他们可以有自己的价格,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;
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;
选项表

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;
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;
产品选项表

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;
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\u选项
表可以按以下方式存储产品

Color: Red -> price $1, sku xxx, stock 3
Size: M -> price $1, sku xxx stock 3
但这并不能反映我是否想储存颜色:红色尺码:我只有一个价格、sku和库存


谢谢

您应该尝试在产品表中输入价格、sku和库存字段。每个唯一的产品都有一个字段,属于产品表

您将产品主信息和其他信息(尺寸/颜色)拆分为两个表

产品(名称、说明等)-这将适用于所有规格相同的产品,例如某一系列的袜子。。它是“家族”——它不储存任何库存,将其视为空壳。。这里需要注意的重要一点是,您可以区分女性和男性版本的产品,并在这里为每个版本创建一个新产品

ProductsQty:这将列出产品的id(如上所示),然后在大小/颜色列中为每个变体设置多行-例如,如果您有3行(大小、颜色、重量),则需要3行。。(对于非服装类产品,请再进一步)-这将是产品的主要“规格”-即中型或大型,或330毫升,200瓦,基本上决定了装置的基本尺寸,可以是毫升、毫米、英寸、克、瓦、伏特。。你可以扩展这一点——记住,产品类型将决定在哪里将两者分开。衣服有颜色和尺寸,但油箱可能有一升作为主要区别,也可能有一种颜色-所以你可以有一个varchar列,输入任何单位,加仑,英尺(我使用matrix1,matrix2,matrix3更通用)

每种颜色和大小都需要一个新行。。中号的蓝袜子与小号的蓝袜子是不同的产品

主要的功能差异应该是一个新产品,也就是说,如果你有一个类似于另一个型号的扬声器,但有额外的蓝牙,这将是一个新的顶级产品。。在拆分尺寸/颜色以及创建新产品时,您必须明智。您仅在第二个表中存储颜色/尺寸变化,以供示例使用

绑起来:

**示例产品:男式Sierra Dri羽绒服**

产品表(id、名称、说明):

221,男式Sierra DriDown全天候夹克,优质三季夹克bla-bla

产品质量(标识、产品标识、尺寸、颜色、数量)

998221,大号,蓝色,22

999,221,大,黑色,4

如果您有多个门店,您将在新表中使用ProductsQty id,并在其中为每个子产品提供storeid和数量

您还可以将sku存储在任一表中-如果该系列具有相同的sku,请将其存储在产品中,如果没有,请将其存储在ProductsQty表中


现在,您可以搜索任意尺寸/颜色/sku-希望这有意义。

这并不能解决我的问题,兄弟。例如,如何查询:获取所有红色和小尺寸的衬衫?搜索我添加的EAV标签。@Raheel我希望您有解决方案。你能提供答案吗?@sankalptanbe我放弃了使用SQL@RaheelKhan我希望你能找到解决办法。请提供答案。提前谢谢。@MitulKoradiya对不起,兄弟,我放弃了那个项目。我应该删除这个问题还是让它像这样,这样其他人可以从下面的答案中受益?谢谢你的回答,但这并不能解决我的问题。我也想到了这个解决方案,但是如果有一个新属性,例如model,该怎么办呢。你必须调整数据库表,我不想这样。