我正在构建一个供应商可以添加产品的平台,而店主可以复制'那些产品到他们的商店出售。
供应商可以创建产品,他可以为它们添加各种属性,例如尺寸,颜色。
当商店想要使用其中一个供应商的产品时,他可以选择他想要提供的属性。例如,如果供应商提供3种尺寸的T恤。该商店可能会选择仅出售2种尺寸的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 |
+---------+------------+-----------+
现在唯一的问题是:如何确保商店可以选择他想要的属性。
答案 0 :(得分:2)
如果它可以改变你的数据库结构我会这样做,我知道它对你所拥有的有点改变,但我认为你必须把产品视为一种关系,这是因为虽然是-shirt是一个产品,实际的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模型上设置关系为color $this->attribute->where('type', color)
;
请注意 一个小注释我通过使用类别和类型表进一步规范化,因此您的属性类型实际上是type_id,它是类型表的属性关系,而您的sku类别将是category_id,属于类别表,将来如果您的类别或类型决定更改名称,您不必编辑1000条记录等
答案 1 :(得分:0)
实际上,您可以在 shop_product_attributes 表格中创建多对多关系。
由于产品属性表格中包含compound key个2个字段:[product_id,description]
,您的多对多关系将具有三键 - {{1}其中[shop_id,product_id,description]
也用作引用外键。