Mysql 多供应商产品定价历史的数据库设计

Mysql 多供应商产品定价历史的数据库设计,mysql,database,database-design,Mysql,Database,Database Design,我目前正在尝试为我的项目设计DB(mysql)结构,这是一家批发公司的在线商店-我已经创建了所有产品,它有多种变体等,但我有以下问题,即多个供应商的价格和历史数据: 请查看项目的以下主要假设: 我们将有几个产品供应商 由于上述原因,每种产品的价格几乎没有差异 我们希望能够拥有每个供应商的每个产品的历史价格数据 变体1 起初,我考虑在数据库中添加两个表: 供应商表:供应商id、名称 价格表:id、产品id、价格供应商1、价格供应商2、价格供应商3、时间戳 然而,在这样的例子中,每当我们想要添加

我目前正在尝试为我的项目设计DB(mysql)结构,这是一家批发公司的在线商店-我已经创建了所有产品,它有多种变体等,但我有以下问题,即多个供应商的价格和历史数据:

请查看项目的以下主要假设:

  • 我们将有几个产品供应商
  • 由于上述原因,每种产品的价格几乎没有差异
  • 我们希望能够拥有每个供应商的每个产品的历史价格数据
变体1

起初,我考虑在数据库中添加两个表:

供应商表:供应商id、名称

价格表:id、产品id、价格供应商1、价格供应商2、价格供应商3、时间戳

然而,在这样的例子中,每当我们想要添加另一个供应商时,我们都需要将行添加到数据库中(我不是db专家,但我想这不是最好的方法)

变体2

另一个想法是让价格表包含以下内容:

供应商表:供应商id、名称

价格表:id、产品id、供应商id、时间戳

然而,在这种情况下,如果我们有5个供应商,我们每天会为1个产品创建5条记录,那么让我们设想一下,我们只有1000个产品,并且希望保留过去6个月的历史数据,这样的表将快速增长


因此,总结一下——哪种方法更好,或者我可以实施另一种方法?非常感谢您的建议。

您应该选择变体2。最好的做法是避免频繁的表重构,在任何时候添加或删除供应商时都必须在变体1中进行重构(尽管MySQL在最近的版本中在这方面速度相当快)。使用单个列来识别不同的供应商值更好。当您不必担心列值发生更改或被完全删除时,它还可以促进查询重用。此外,空间也不应该成为一个真正的问题。给你一个想法,如果你的价格表有1000000行(6个月),它的大小大约是40-5000万行(假设只有主键索引)。MySQL还提供压缩和分区功能,以减少存储空间,如果这确实是一个问题的话。

变体2更好。保持行短,添加适当的索引。可能需要考虑将所有历史记录保存在一个表中,并将最新的价格(当前价格)存储在一个较小的表中(如果需要经常引用当前价格),从给定的信息中,价格历史表将少于一百万行(1000个产品*每天5个价格** 183天=915000行)。感谢您的回答:我刚刚意识到,由于不是每个产品都有相同的供应商集,所以另一个表很方便:product+supplier将product_id与supplier_id连接起来,因为我们的价格表应该更短,因为我们只存储价格变化:price table:id,product+supplier_id,正如其他答案所暗示的那样,关于这一点没有任何疑问。选择2每次。唯一的问题是您希望多久参考一次旧的价格,所以建议使用两个表-供应商价格和价格历史记录可能是一个好主意。否则,您可能会添加一个IsCurrentPrice标志以进行快速查找。忘了桌子有多大吧。从长远来看,你别无选择。