Mysql 产品上多个选项的数据库结构

Mysql 产品上多个选项的数据库结构,mysql,database,Mysql,Database,我的数据库(MySQL)中有产品。 我的价格是基于我的产品的不同选择组合而定的。 我有以下数据: 产品 prodID | prodName 1 | Ball optionID | optionName | prodID 1 | color | 1 2 | size | 1 3 | material | 1 ovID | optionID | ovValue 1 | 1 | red 2 |

我的数据库(MySQL)中有产品。 我的价格是基于我的产品的不同选择组合而定的。 我有以下数据:

产品

prodID | prodName
1      | Ball
optionID | optionName | prodID
1        | color      | 1
2        | size       | 1
3        | material   | 1
ovID | optionID | ovValue
1    | 1        | red
2    | 1        | blue
3    | 2        | small
4    | 2        | big
5    | 3        | wood
6    | 3        | glass
选项

prodID | prodName
1      | Ball
optionID | optionName | prodID
1        | color      | 1
2        | size       | 1
3        | material   | 1
ovID | optionID | ovValue
1    | 1        | red
2    | 1        | blue
3    | 2        | small
4    | 2        | big
5    | 3        | wood
6    | 3        | glass
选项值

prodID | prodName
1      | Ball
optionID | optionName | prodID
1        | color      | 1
2        | size       | 1
3        | material   | 1
ovID | optionID | ovValue
1    | 1        | red
2    | 1        | blue
3    | 2        | small
4    | 2        | big
5    | 3        | wood
6    | 3        | glass
对于价格,我希望如下所示:

红色小木球-$13 红色小玻璃球-14 红色大木球-16 红色大玻璃球-17 蓝色小木球-12.5 [……]

我如何为此设计数据库结构?
我试过好几种方法,但没有一种是好的。如果选项的数量是静态的,那么每个选项都可以有自己的表,但这不是一个好的解决方案。

我喜欢您已经有的。如果你想让它像我想的那样完全灵活,我会做以下几点:

再添加两个表

产品实例

instanceID | prodID | price
1          | 1      | 13
产品\实例\选项

instanceID | ovID
1          | 1
1          | 3
1          | 6

通过这种方式,您可以为它们定义所有可能的组合和价格。设置所有的价格可能需要大量的工作,但是如果你不能计算它们(比如玻璃=2$,小=2$/大=4$),你会得到这个,不管你怎么做。

像这样的东西怎么样:

产品类型

prodID | prodName
1      | Ball
2      | Car
prodInstanceID | prodID | Prize
1              | 1      | $19
2              | 1      | $50
3              | 2      | $8
propertyID  | propertyName
1           | color
2           | size
3           | material
pvID |propertyID  | propertyName
1    | 1          | red
2    | 1          | blue
3    | 2          | small
4    | 2          | medium
5    | 2          | large
6    | 3          | wood
7    | 3          | glass
ppID | prodInstanceID | pvID
1    | 1              | 1
2    | 1              | 3
3    | 1              | 6
4    | 2              | 2
5    | 2              | 4
6    | 2              | 7
7    | 3              | 1
8    | 3              | 3 
9    | 3              | 6 
productInstances

prodID | prodName
1      | Ball
2      | Car
prodInstanceID | prodID | Prize
1              | 1      | $19
2              | 1      | $50
3              | 2      | $8
propertyID  | propertyName
1           | color
2           | size
3           | material
pvID |propertyID  | propertyName
1    | 1          | red
2    | 1          | blue
3    | 2          | small
4    | 2          | medium
5    | 2          | large
6    | 3          | wood
7    | 3          | glass
ppID | prodInstanceID | pvID
1    | 1              | 1
2    | 1              | 3
3    | 1              | 6
4    | 2              | 2
5    | 2              | 4
6    | 2              | 7
7    | 3              | 1
8    | 3              | 3 
9    | 3              | 6 
属性

prodID | prodName
1      | Ball
2      | Car
prodInstanceID | prodID | Prize
1              | 1      | $19
2              | 1      | $50
3              | 2      | $8
propertyID  | propertyName
1           | color
2           | size
3           | material
pvID |propertyID  | propertyName
1    | 1          | red
2    | 1          | blue
3    | 2          | small
4    | 2          | medium
5    | 2          | large
6    | 3          | wood
7    | 3          | glass
ppID | prodInstanceID | pvID
1    | 1              | 1
2    | 1              | 3
3    | 1              | 6
4    | 2              | 2
5    | 2              | 4
6    | 2              | 7
7    | 3              | 1
8    | 3              | 3 
9    | 3              | 6 
属性值

prodID | prodName
1      | Ball
2      | Car
prodInstanceID | prodID | Prize
1              | 1      | $19
2              | 1      | $50
3              | 2      | $8
propertyID  | propertyName
1           | color
2           | size
3           | material
pvID |propertyID  | propertyName
1    | 1          | red
2    | 1          | blue
3    | 2          | small
4    | 2          | medium
5    | 2          | large
6    | 3          | wood
7    | 3          | glass
ppID | prodInstanceID | pvID
1    | 1              | 1
2    | 1              | 3
3    | 1              | 6
4    | 2              | 2
5    | 2              | 4
6    | 2              | 7
7    | 3              | 1
8    | 3              | 3 
9    | 3              | 6 
产品属性

prodID | prodName
1      | Ball
2      | Car
prodInstanceID | prodID | Prize
1              | 1      | $19
2              | 1      | $50
3              | 2      | $8
propertyID  | propertyName
1           | color
2           | size
3           | material
pvID |propertyID  | propertyName
1    | 1          | red
2    | 1          | blue
3    | 2          | small
4    | 2          | medium
5    | 2          | large
6    | 3          | wood
7    | 3          | glass
ppID | prodInstanceID | pvID
1    | 1              | 1
2    | 1              | 3
3    | 1              | 6
4    | 2              | 2
5    | 2              | 4
6    | 2              | 7
7    | 3              | 1
8    | 3              | 3 
9    | 3              | 6 

在您的设计中,您无法确定哪个选项属于哪个产品实例。如果查看表optionvalues,则无法将选项组合在一起。

您必须为每个产品的每个实例插入所有值(如红色/小值)。您可能会在数据库中找到数百或数千次“small”一词。这是冗余=不好。无论如何,对于一个紧密的appropiation@Flo,你说得对。我修改了我的答案。将价格移动到productinstance并创建了propertyvalues表。编辑:事实上,现在我的答案和你的答案一样。jea,现在你的答案和我的答案几乎一样,只是增加了一个主键。(这不是必需的)您如何对此进行查询以获得给定选项数组的价格?回答我上面的评论问题: