【发布时间】:2011-03-02 02:55:46
【问题描述】:
我正在考虑两种桌子设计方案,但我不确定每种方案的优缺点。
下面是对我的情况的一些抽象的描述:
我正在跟踪一些数据点(category_id, point_id, value)。
大多数时候,我只对数据点的当前值感兴趣。但是每当有变化时,我都需要记录所有历史值。
有时我可能想查看特定点的历史值,但如果这些查询有点慢也没关系。最重要的是我能尽快得到所有点的当前值,或者某个特定类别的所有点的当前值。
我正在考虑的两种(可能还有三种)方法:
- 使用两个单独的表,一个
current_vales和一个history表,并带有一个触发器,每次current_values中的某些内容发生更改时,该触发器将在历史表中插入一行。 - 仅使用一个表,每行带有布尔标志
isCurrent。每当值更改时,将该行标记为不再是当前行,并使用更新后的值插入一个新的当前行。 - (在每一行上只使用一个带有时间戳的表——那么特定 id 的当前值就是带有最新时间戳的行。但这似乎很难表达为查询,特别是如果我想获得所有特定类别的当前值,甚至不确定在没有子查询或性能的情况下如何表达)
一次只会有大约 3,000-5,000 个当前点,但值的变化足够频繁,其中多达一半每天都会发生变化,因此最终会有数十万行历史记录。
上述每种方法的优缺点是什么(或者还有其他我没有提到的更好的方法)?鉴于我的目标是尽快获得当前的一组点,并且可以接受较慢的历史查询,哪一个最好?
【问题讨论】:
标签: mysql sql database-schema database-design