我需要为app设置架构。它专为销售产品而设计。
系统每天将接受约30-40k的新产品。 这将导致在表产品中创建新记录。
系统应保留价格历史。用户应该能够看到产品A的价格在去年变化了。
所以我有两个选择:
当新产品问世时,我将旧产品移动(复制和删除)到另一个表格。我们将其命名为 product_history 。因此,产品表仅包含目前正在销售的产品。因此,我将需要重写查询,因为来自产品的行可以在表产品中或表product_history中(如果客户希望查看销售历史,统计信息等)。
什么都没有删除。我将旧产品放在同一张桌子上,只是将它们标记为旧有一些属性(" is_old")。新记录由Redis编制索引。
解决方案2使代码更容易,但我担心表格会变大。 优点是不会复制数据。没有搞乱删除。
解决方案1使系统支持更高。有效表产品将始终保持较小。但总是用两张桌子比一张桌子更难玩。
有一点需要注意,与问题无关,但它使事情变得更复杂:每种产品最多可以有12种不同的价格(未来可能更多)。所以现场价格存储为json并且已经被Redis索引。
哪种解决方案将来会带来更少的痛苦?你会选哪一个?
答案 0 :(得分:0)
我的选择是: 1.转到选项#2,它更清晰,选项#1的迁移部分增加了写入负载&复杂性。
使用'有效'每个产品项的标志,默认为1或为真。
将表分区为活动标志,以便活动项(唯一查询的项)位于单个分区中,而在其他分区中处于非活动状态。
为了定价,不要将json存储为varchar / text,使用native JSON field(mysql 5.7+),它将允许您在JSON中进行更丰富的查询。
对于redis同步,我还建议探索debezium以将mysql更改流式传输到redis。