我的简化和人为的例子如下: -
假设我想每天测量和存储世界上所有城镇的温度(和其他值)。我正在寻找一种存储数据的最佳方式,以便获得所有城镇的当前温度,就像获得一个城镇历史上的所有温度一样容易。
这是一个很容易解决的问题,但我正在寻找最佳解决方案。
我能想到的两个主要选项如下:-
选项 1 - 同一张表存储当前和历史记录
将所有当前记录和存档记录存储在同一个表中。
IE
CREATE TABLE [dbo].[WeatherMeasurement](
MeasurementID [int] Identity(1,1) NOT Null,
TownID [int] Not Null,
Temp [int] NOT Null,
Date [datetime] NOT Null,
)
这将使一切变得简单,但是获取城镇列表和当前温度的最有效查询是什么?一旦表中有数百万行,这会扩展吗?通过在表中添加某种 IsCurrent 标志有什么好处吗?
选项 2 - 将所有存档记录存储在单独的表中
将有一个表来存储当前的实时测量值
CREATE TABLE [dbo].[WeatherMeasurement](
MeasurementID [int] Identity(1,1) NOT Null,
TownID [int] Not Null,
Temp [int] NOT Null,
Date [datetime] NOT Null,
)
还有一个存储历史存档日期的表(可能由触发器插入)
CREATE TABLE [dbo].[WeatherMeasurementHistory](
MeasurementID [int] Identity(1,1) NOT Null,
TownID [int] Not Null,
Temp [int] NOT Null,
Date [datetime] NOT Null,
)
这样做的好处是保持当前主要数据精简,查询效率很高,但代价是架构更复杂,插入数据更昂贵。
哪个是最好的选择?有没有我没有提到的更好的选择?
注意:我已经简化了架构以帮助更好地集中我的问题,但假设每天都会插入大量数据(100,000 条记录),并且数据是一天的最新数据。当前数据与历史数据一样可能被查询。