【问题标题】:Laravel, Products with Attributes in a many-to-many tableLaravel,多对多表中具有属性的产品
【发布时间】:2017-11-02 07:22:52
【问题描述】:

我正在构建一个平台,供应商可以在其中添加产品,而店主可以将这些产品“复制”到他们的商店并出售。

供应商可以创建产品,并且可以为其添加各种属性,例如尺寸、颜色。

当商店想要使用供应商的一种产品时,他可以选择他想要提供的属性。例如,如果供应商提供 3 种尺寸的 T 恤。商店可以选择仅出售 2 种尺寸的 T 恤。

所以我有一个如下所示的 Products 表。供应商在此处添加产品。

+----+-------------+-------+
| id | description | price |
+----+-------------+-------+
|  1 | T-Shirt     |    10 |
|  2 | Car         |   100 |
+----+-------------+-------+

我有一个产品属性表,也是由供应商填写的

+------------+-------------+------------------------------+
| product_id | description |           options            |
+------------+-------------+------------------------------+
|          1 | size        | ["small", "medium", "large"] |
|          1 | color       | ["white", "black"]           |
+------------+-------------+------------------------------+

店面

当店主想要产品时。我在shop_products表中做一个记录,引用哪个Shop想要什么产品,并添加一个可选图片,如下

+---------+------------+-----------+
| shop_id | product_id |   image   |
+---------+------------+-----------+
|       1 |          2 | image.jpg |
|       1 |          3 | image.jpg |
+---------+------------+-----------+

现在剩下的唯一问题是:我如何确保商店可以选择他想要的属性。

  • 我应该创建一个 shop_product_attributes 表吗?但我不能在多对多上建立关系,因为它没有 id?

【问题讨论】:

  • 您是否想要它,以便商店可以限制他们使用的具有特定属性的产品?所以说T恤小黑?
  • 是的!商店确实可以选择要复制的属性。谢谢!

标签: mysql database laravel database-design


【解决方案1】:

如果可以更改您的数据库结构,我会这样做,我知道这对您所拥有的有所改变,但我认为您必须将产品视为一种关系,这是因为虽然 t - 衬衫是一种产品,实际的黑色中号 T 恤与小号黑色 T 恤是完全不同的产品,您的供应商几乎肯定会以这种方式推荐它们

您的产品表看起来像这样,但它不是您引用产品的主表,它包含产品将具有的通用内容,例如描述 或者一个名字

+----+-------------+-------+-----------+-------------+
| id | name        | price | image     | description |
+----+-------------+-------+-----------+-------------+
|  1 | Super-T     |    10 | image.jpg | some text   |
|  2 | Focus       |   100 | image.jpg | some text   |
+----+-------------+-------+-----------+-------------+

您的主表将是一个 sku 表,将其视为您的产品,如果您有任何特定于 sku 的内容,您可以将它们放在这里

+----+-------------+------------+--------------+
| id | sku         | product_id |  category    |
+----+-------------+------------+--------------+
|  1 | p1-cb-m     |    1       | t-shirt      |
|  2 | p2-cb-s     |    2       | t shirt      |
+----+-------------+------------+--------------+

然后有一个attributes_sku表,这会将sku链接到属性

+---------------+--------------+
| sku_id        | attribute_id |
+---------------+--------------+
| 1             |    1         |
| 1             |    2         |
+---------------+--------------+

标准化属性

+----+-------------+------------+
| id | type        | name       |
+----+-------------+------------+
|  1 | color       |    black   |
|  1 | size        |    medium  |
+----+-------------+------------+

购买 Sku 表

+---------+------------+
| shop_id | sku_id     | 
+---------+------------+
|       1 |          1 |
|       1 |          2 |
+---------+------------+

这样做的好处是你可以做到 foreach $shop->skus where category = t-shirt展示他们所有的T恤

然后你可以做 $skus->product->name $skus->product->attribute->name 或者更好的是在 sku 模型上设置一个关系,比如颜色 $this->attribute->where('type', color);

注意 一个小说明我会通过有一个类别和类型表来进一步规范化这一点,所以你的属性类型实际上是一个 type_id,它是一个类型表的归属关系,你的 sku 类别将是一个 category_id,一个类别表,将来如果您的类别或类型决定更改名称,您不必编辑 1000 条记录等

【讨论】:

  • 这个想法很好!它看起来像是一个更好的模型。你怎么想出这么好的模型?我似乎总是迷失在我的桌子上。我要实现这个模型(在我完全理解之后!非常感谢。
  • 感谢编辑!这真是个好主意。有没有一种方法可以让具有少量数据库知识的人从我的数据库“设计”到您的版本?还是只是经验让你想出了这个完美的设计?
  • 它只是经验和理解规范化,关键是把事情分解成块,看看你在哪里重复你自己,然后把它们规范化。
  • 再次感谢您的宝贵时间,还有一个问题。所以现在我正确地使用 SKU 作为商店拥有的商品。但是一个供应商,所以创建产品的人也应该能够为这些产品选择可能的属性。那么我应该添加一个 product_attributes 列表吗?这与 sku_attributes 的作用相同,但对于供应商而言呢?
  • 或者我应该使用多态性并将 sku_attributes 更改为 productable_attributes 以便供应商和商店都可以使用同一个表来存储属性?
【解决方案2】:

实际上,您可以在 shop_product_attributes 表中创建多对多关系。

由于您的 Product Attributes 表有一个 compound key 的 2 个字段:[product_id,description],因此您的多对多关系将有一个三元键 - [shop_id,product_id,description],其中 [product_id,description] 是也用作参考外键。

【讨论】:

  • 感谢您的回答!我觉得很难理解对不起!那么我应该得到 2 个多对多表吗?
  • 是的,一个用于shop_product,另一个用于shop_product_attributes。尽管第一个看起来有点没用,但它是正确的规范化形式。
猜你喜欢
  • 1970-01-01
  • 2020-02-18
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多