产品数据库中的多个变体

3

我知道有很多类似的问题,但我已经阅读了很多答案,但不幸的是,我没有理解或者可能不满意。

目标 我希望我的产品可以具有多个属性,并根据它们的组合拥有价格、sku和库存

例子 T恤产品具有尺寸、颜色和材料属性(选项)

因此我希望有这种灵活的结构:

颜色:红色,尺码: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;

因此,products_options表可以以以下方式存储商品。
Color: Red -> price $1, sku xxx, stock 3
Size: M -> price $1, sku xxx stock 3

但是它并不能反映我想要存储颜色:红色 尺码:m 有一个价格、sku和库存。谢谢。

1
搜索我添加的EAV标签。 - Rick James
@Raheel,希望你有解决方案。你能提供答案吗? - Sankalp Tambe
@SankalpTambe 我放弃使用SQL了。 - Raheel
@RaheelKhan,希望你已经得到了解决方案。请提供答案。提前致谢。 - Mitul Koradiya
@MitulKoradiya 抱歉,兄弟,我放弃了那个项目。我应该删除这个问题还是让它保持现状,以便其他人可以从下面的答案中受益? - Raheel
你有什么东西吗? - Oliver D
2个回答

0

你需要将产品的主要信息和其他信息(大小/颜色)分成两个表。

产品(名称,描述等)- 这是针对所有具有相同规格的产品 - 例如一定范围的袜子。它是“家族” - 它不存储任何库存,请将其视为空壳。。重要的是要注意,您需要区分产品的女性和男性版本,并在此处为每个版本创建一个新产品。

ProductsQty: 这将列出产品的ID(上面),然后具有大小/颜色列,每个变体都有多行 - 如果您有3个(大小、颜色、重量),例如,您需要3行..(对于非服装物品进一步进行1步)-这将是产品的主要“规格”-即中等或大型,或330毫升、200瓦特,基本上确定单位的基本大小,无论是毫升、毫米、英寸、克、瓦特、伏特..您可以扩展此 - 请记住,产品类型将确定在哪里拆分两者。衣服有颜色和尺寸,但燃油箱可能有升作为主要区别,可能还有颜色-因此您可以有一个varchar列并输入任何单位,加仑、英尺(我使用matrix1、matrix2、matrix3更通用..)

您需要为每个颜色尺寸创建新行..中号蓝袜子与小号蓝袜子不同..

主要的特性差异应该是一个新产品 - 例如,如果你有一个类似于另一个型号的扬声器套装,但是有额外的蓝牙功能,这将成为一个新的顶级产品...你必须聪明地判断何时拆分尺寸/颜色以及何时创建一个新产品。在你的示例中,只需将颜色/尺寸变化存储在第二个表中即可。

总结一下:

**示例产品:男士Sierra Dri Down夹克**

产品表(id,name,description):

221,男士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 - 希望这样说得通..


谢谢您的回答,但这并不能解决我的问题。我也考虑过这个解决方案,但如果有一个新属性,比如模型,那么你就必须调整数据库表,而我不想这样做。 - Refilon

0
你应该尝试将价格、SKU和库存字段放在产品表中。每个唯一的产品都恰好有这些字段之一,并且属于产品表。请查看示例数据库模式。

这并没有解决我的问题,兄弟。你怎么查询例如:获取所有红色且尺寸为小号的衬衫? - Raheel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接