Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Laravel,多对多表中具有属性的产品_Mysql_Database_Laravel_Database Design - Fatal编程技术网

Mysql Laravel,多对多表中具有属性的产品

Mysql Laravel,多对多表中具有属性的产品,mysql,database,laravel,database-design,Mysql,Database,Laravel,Database Design,我正在建立一个平台,供应商可以在其中添加产品,店主可以将这些产品“复制”到他们的店铺并销售 供应商可以创造产品,他可以为产品添加各种属性,比如尺寸、颜色 当一个商店想要使用供应商的产品时,他可以选择他想要提供的属性。例如,如果供应商提供的T恤衫有3种尺寸。商店可能会选择只卖两种尺码的T恤 所以我有一个产品表,看起来像这样。供应商在这里添加产品 +----+-------------+-------+ | id | description | price | +----+-------------

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

供应商可以创造产品,他可以为产品添加各种属性,比如尺寸、颜色

当一个商店想要使用供应商的产品时,他可以选择他想要提供的属性。例如,如果供应商提供的T恤衫有3种尺寸。商店可能会选择只卖两种尺码的T恤

所以我有一个产品表,看起来像这样。供应商在这里添加产品

+----+-------------+-------+
| 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

实际上,您可以在shop\u product\u attributes表中创建多对多关系


由于您的产品属性表有两个字段:
[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_属性更改为可生产_属性,以便供应商和车间都可以使用相同的表来存储属性?