【问题标题】:Efficient database design for multiple price based on quantity and attribute基于数量和属性的多种价格的高效数据库设计
【发布时间】:2018-01-15 06:28:59
【问题描述】:

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

PID | Name                | Type  | Colour  | Colour Print | Quantity: 1 to 149 |   150 to 199| 200 to 249 |250 to 499
1   |White ABC Product    |ABC    |White    |1CP           |2.34|2.07   |1.82|1.51
2   |White ABC Product    |ABC    |White    |2CP           |2.6 |2.31   |1.97|1.62
3   |White ABC Product    |ABC    |White    |3CP          |2.86|2.55|2.14|1.77
7   |Red ABC Product      |ABC    |Red      |1CP           |2.39|2.12|1.87|1.56
8   |Red ABC Product      |ABC    |Red      |2CP           |2.65|2.36|2.02|1.67
9   |Red ABC Product      |ABC    |Red      |3CP           |2.91|2.6|2.19|1.82
12  |White XYZ Product    |XYZ    |White    |1CP           |2.69|2.38|2.09|1.74
13  |White XYZ Product    |XYZ    |White    |2CP           |2.69|2.38|2.09|1.74
14  |White XYZ Product    |XYZ    |White    |3CP           |3.29|2.93|2.46|2.04
18  |Emerald  XYZ Product |XYZ    |Emerald  |1CP           |2.74|2.43|2.14  |1.79   
19  |Emerald  XYZ Product |XYZ    |Emerald  |2CP           |3.04|2.71|2.32  |1.91   
20  |Emerald  XYZ Product |XYZ    |Emerald  |3CP           |3.34|2.98|2.51  |2.09

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

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

当用户根据产品类型、颜色、彩色印刷和数量选择选项时,会向用户显示价格。

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

我发现第一个选项更易于实施,但不确定它是否最有效或者是否正确。

您的意见将不胜感激。谢谢!

【问题讨论】:

  • 在超高水平上,一切看起来都是 1-many?
  • 第二个选项看起来更接近我,但似乎架构可能会受益于进一步的规范化

标签: mysql database-design


【解决方案1】:

你现在有多少行?如果少于 1000 万,为什么还要费心做出改变?您是否需要将所有“翡翠”更改为“绿色”?有“过度规范化”之类的东西。

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

quantity ENUM('1-149', '150-199', '200-249', '250-499')

这将占用 1 个字节。但是,我不会将 ENUM 用于可能经常更改的列表,或者具有超过 20 个值的列表。 (实际限制要高得多。)

如果您使用标准化,请使用TINYINT UNSIGNED(1 字节,0..255)或SMALLINT UNSIGNED(2 字节,0..65K)。

如果您进行规范化并想要查找所有“emerald & XYZ”项目,则查询将变得混乱且缓慢。

请提供可能的SELECTs(基于方便的),以便我们进一步评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多