Mysql 基于数量和属性的多价格数据库设计

Mysql 基于数量和属性的多价格数据库设计,mysql,database-design,Mysql,Database Design,我有一个根据数量和属性不同价格的产品的数据样本。价格可能会偶尔更新(不太频繁) 因此,基本上,我可以将数据库设计为与上述数据样本相同的结构,并将所有数据转储到表中(大量重复),或者我可以这样做: Product Table: --------- --Product id --Product name {ABC, XYZ, PQR...so on} Colour Table: ------- --Colour id --Colour value {white, red, emerald, an

我有一个根据数量和属性不同价格的产品的数据样本。价格可能会偶尔更新(不太频繁)

因此,基本上,我可以将数据库设计为与上述数据样本相同的结构,并将所有数据转储到表中(大量重复),或者我可以这样做:

Product Table:
---------
--Product id
--Product name {ABC, XYZ, PQR...so on}


Colour Table:
-------
--Colour id
--Colour value {white, red, emerald, and so on}

Colour Print Table 
--------
--Colour print id
--Colour print value {1CP, 2CP, 3CP}

Quantity Table
--------
--Quantity id
--Quantity value {1-149, 150-199, 200-249,250-499}

Price Table
-------
--Price id
--Product id
--Colour id
--Colour Print id
--Quantity id
--Price
Price table                 
price id |  product id |colour id | quantity id | colourprint id |  price
1        | 1           |1         | 1           |1               |2.34
2        | 1           |1         | 2           |1               |2.07
3        | 1           |1         | 3           |1               |1.82
4        | 1           |1         | 4           |1               |1.51
5        | 1           |1         | 1           |2               |2.6
6        | 1           |1         | 2           |2               |2.31
7        | 1           |1         | 3           |2               |1.97
8        | 1           |1         | 4           |2               |1.62
9        | 1           |1         | 1           |3               |2.86
因此,价格表将如下所示:

Product Table:
---------
--Product id
--Product name {ABC, XYZ, PQR...so on}


Colour Table:
-------
--Colour id
--Colour value {white, red, emerald, and so on}

Colour Print Table 
--------
--Colour print id
--Colour print value {1CP, 2CP, 3CP}

Quantity Table
--------
--Quantity id
--Quantity value {1-149, 150-199, 200-249,250-499}

Price Table
-------
--Price id
--Product id
--Colour id
--Colour Print id
--Quantity id
--Price
Price table                 
price id |  product id |colour id | quantity id | colourprint id |  price
1        | 1           |1         | 1           |1               |2.34
2        | 1           |1         | 2           |1               |2.07
3        | 1           |1         | 3           |1               |1.82
4        | 1           |1         | 4           |1               |1.51
5        | 1           |1         | 1           |2               |2.6
6        | 1           |1         | 2           |2               |2.31
7        | 1           |1         | 3           |2               |1.97
8        | 1           |1         | 4           |2               |1.62
9        | 1           |1         | 1           |3               |2.86
当用户根据产品类型、颜色、彩色打印和数量选择选项时,将向用户显示价格

未来可能还会添加新产品。我希望以最有效的方式设计数据库

我发现第一个选项更容易实现,但不确定它是最有效的还是正确的


如果您能提供意见,我们将不胜感激。谢谢大家!

您现在有多少行?如果少于1000万,为什么还要费心去改变呢?你是否需要把所有的“翡翠”都改成“绿色”?有一种说法是“过度正常化”

如果您关心空间,可以使用
ENUM
避免这些“规范化”表中的每一个,例如

quantity ENUM('1-149', '150-199', '200-249', '250-499')
这需要1个字节。但是,对于一些可能经常更改的列表,或者具有超过20个值的列表,我不会使用ENUM。(实际限制要高得多。)

如果使用规范化,请使用
TINYINT UNSIGNED
(1字节,0..255)或
SMALLINT UNSIGNED
(2字节,0..65K)

如果您确实进行了规范化,并且希望查找所有“emerald&XYZ”项,那么查询将变得混乱而缓慢


请提供可能的
选择
(基于任何方便的选项),以便我们可以对其进行进一步的评论。

在超高级别上,所有内容看起来都是1-many?第二个选项看起来更接近我,但架构似乎可以从进一步的规范化中受益