这是一篇关于数据库设计中保存某些数据属性值历史的文章,主要内容如下:
- 问题阐述:企业销售各种水果,水果价格随时间变化,需要保存历史价格信息及当前价格,本文以水果价格为例进行讨论。
- 简单无历史模式:仅包含水果类型及价格属性,物理模式简单,创建
fruits表存储水果信息,但无法保存价格历史。 - 逻辑模式:锚点:确定“水果类型”和“历史价格”为锚点,用于构建逻辑模式,“TBD”表示待讨论物理表。
- 逻辑模式:属性:定义“历史价格”锚点的属性,包括价格值、生效时间和失效时间,用于记录价格历史及当前价格等情况。
- 逻辑模式:链接:确定水果与价格之间的 1:N 链接关系,用于关联水果和其价格历史记录。
- 物理模式:选择表策略:选择按锚点创建表的常见策略,确定各锚点和属性的物理表及列名。
- 草案 SQL 模式:结合逻辑模式创建初步的 SQL 模式,包括
fruits和fruit_prices表,但存在查询性能等问题。 - 改进的 SQL 模式:使用哨兵值:用固定的“9000-01-01 00:00:00”作为
valid_to的哨兵值,简化查询,获取当前价格也更简单。 - 最终 SQL 模式:索引:添加覆盖
(fruit_id, valid_from)的索引,提高查询性能。 - TL;DR:适应任意属性的模式:模板可用于将该模式应用于其他数据属性的历史记录保存,对比单时间戳模式,双时间戳模式更简单高效。
- ChatGPT 的看法:ChatGPT 采用单时间戳方法,建议更多索引,喜欢外键,对价格列的处理及在
fruits表中保留当前价格副本等方面与本文观点不同,同时指出文中存在语言歧义的地方。 - 结论:保存属性历史是常见需求,本文展示了系统设计和实现历史属性的方法,先构建逻辑模型,再构建传统关系型实现,可用于设计任何数据库。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。