Mysql Laravel,多对多表中具有属性的产品
我正在建立一个平台,供应商可以在其中添加产品,店主可以将这些产品“复制”到他们的店铺并销售 供应商可以创造产品,他可以为产品添加各种属性,比如尺寸、颜色 当一个商店想要使用供应商的产品时,他可以选择他想要提供的属性。例如,如果供应商提供的T恤衫有3种尺寸。商店可能会选择只卖两种尺码的T恤 所以我有一个产品表,看起来像这样。供应商在这里添加产品Mysql Laravel,多对多表中具有属性的产品,mysql,database,laravel,database-design,Mysql,Database,Laravel,Database Design,我正在建立一个平台,供应商可以在其中添加产品,店主可以将这些产品“复制”到他们的店铺并销售 供应商可以创造产品,他可以为产品添加各种属性,比如尺寸、颜色 当一个商店想要使用供应商的产品时,他可以选择他想要提供的属性。例如,如果供应商提供的T恤衫有3种尺寸。商店可能会选择只卖两种尺码的T恤 所以我有一个产品表,看起来像这样。供应商在这里添加产品 +----+-------------+-------+ | id | description | price | +----+-------------
+----+-------------+-------+
| 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_id | product_id | image |
+---------+------------+-----------+
| 1 | 2 | image.jpg |
| 1 | 3 | image.jpg |
+---------+------------+-----------+
现在唯一剩下的问题是:我如何确保商店可以选择他想要的属性
- 我是否应该创建一个商店产品属性表。。但是我不能在多对多上建立关系,因为它没有id
由于您的产品属性表有两个字段:
[Product\u id,description]
,因此您的多对多关系将有一个三元键-[shop\u id,Product\u id,description]
其中[Product\u id,description]
也用作参考外键。如果有可能更改您的数据库结构,我会这样做,我知道这对您拥有的有点改变,但我认为您必须将产品视为一种关系,这是因为,虽然t恤是一种产品,但实际的黑色中码t恤与黑色小码t恤完全不同,您的供应商几乎肯定会以这种方式推荐他们
您的products表看起来像这样,但它不是引用产品的主表,它包含产品将具有的通用内容,例如描述
或者一个名字
+----+-------------+-------+-----------+-------------+
| 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 |
+----+-------------+------------+--------------+
然后有一个属性\u 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->SKU其中category=t-shirt
显示所有t恤
然后您可以执行$SKU->product->name
$sku->product->attribute->name
或者更好地将sku模型上的关系设置为say color$this->attribute->where('type',color)
注
一个小提示,我将通过使用categories and types表来进一步规范这一点,因此您的属性类型实际上将是一个类型id,它是一个属于类型表的关系,而您的sku类别将是一个类别id,属于一个categories表,将来如果您的分类或类型决定更改名称,则不必编辑1000条记录等谢谢您的回答!我觉得很难理解对不起!那么,我是否应该得到两个多对多表?是的,一个用于商店产品,另一个用于商店产品属性。尽管第一个看起来有点没用,但它是正确的标准化形式。你想要它吗?这样商店就可以限制那些带有微粒属性的产品?比如说一件黑色的t恤衫?是的!商店确实可以选择要复制的属性。非常感谢。这是非常好的想法!这看起来是一个更好的模式。你是怎么想出这么好的模型的?我似乎总是在桌子上迷了路。我将实现这个模型(在我完全理解它之后!非常感谢。感谢您的编辑!这是一个非常好的主意。有没有一种方法可以让拥有小数据库知识的人从我的数据库“设计”到您的版本?还是仅仅是经验让您提出了这一完美的设计?这只是经验和理解规范化,关键是分解问题分成几块,看看你在哪里重复你自己,然后将它们正常化。再次感谢你的时间,还有一个问题。因此,现在我正确地使用SKU作为商店拥有的物品。但是供应商,所以创建产品的人也应该能够为这些产品选择可能的属性。我应该添加产品属性列表吗那么?这与sku_属性相同,但对于供应商来说是这样吗?或者我应该使用多态性并将sku_属性更改为可生产_属性,以便供应商和车间都可以使用相同的表来存储属性?