当前位置: 首页 > 面试题库 >

在SQL Server 2005/2008中存储历史数据的最佳方法是什么?

姜晨
2023-03-14
问题内容

我的简化人为示例如下:

可以说,我想每天测量和存储世界上所有城镇的温度(和其他值)。我正在寻找一种存储数据的最佳方式,以使获取所有城镇中的当前温度与获取一个城镇历史上的所有温度一样容易。

这是一个很容易解决的问题,但我正在寻找最佳解决方案。

我能想到的2个主要选项如下:

将所有当前记录和归档记录存储在同一表中。

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条记录),并且数据是一天之内的最新数据。当前数据与历史数据一样可能被查询。


问题答案:

它取决于应用程序的使用方式…如果使用方式指示将比当前值更频繁地查询历史数据,则将它们全部放在一个表中…但是如果历史查询是例外,则(或小于10%的查询),并且更常见的当前值查询的性能会因为将所有数据放在一个表中而受损,然后将这些数据分离到自己的表中是很有意义的…



 类似资料:
  • 问题内容: 基本上,我的问题是- 我有一个价格清单,其中一些是历史价格(即,我希望能够搜索到产品X在3月11日价格为0.99美元,在4月1日价格为1.99美元,等等)。存储此信息的最佳方法是什么? 我以为我可能会有一个产品表,该产品表具有一个价格表的外键。最初,我认为存储当前价格可能是最好的选择,但是我想我希望能够存储历史价格数据,所以最好的方法是存储一个类似于以下价格表的表: 我在这里有点茫然。

  • 我正在通过使用Laravel作为后端开发来创建一个电子商务移动应用程序。 方案:我有一个Product表,其中存储了有关产品的一些信息。每当用户购买一个产品,他将得到一个购买历史记录(它将显示产品信息)将被存储到数据库中。所以当卖家更新他们的产品信息时,用户购买历史记录的产品信息不会受到影响。 问题:如果我只是简单地创建一个用户的购买历史记录表来存储每个用户的记录,我认为这将在数据库中需要大量的空

  • 问题内容: 最近,我考虑了将历史数据存储在MySQL数据库中的最佳做法。目前,每个可版本控制的表都有两列-和,两者均为类型。具有当前数据的记录已充满了创建日期。当我更新此行时,我填写了更新日期,并添加了与上一行相同的新记录- 简单的东西。但是我知道表会非常快,因此获取数据可能会很慢。 我想知道您是否有任何存储历史数据的做法? 问题答案: 担心“大”表和性能是一个常见的错误。如果您可以使用索引来访问

  • 问题内容: 在MySQL数据库中存储IP地址的最佳字段类型和长度是什么? IPv6呢? 问题答案: 将IP存储为,然后使用和功能存储/检索IP地址。 样例代码:

  • 我有一个游戏,在MySQL数据库中存储boss在简单模式和硬模式下的杀人记录。有14个老板。我想存储一个球员杀死一个老板的次数和难度。我有几个选择,我可以看到。。 为每个boss以及每个难度在表中创建一个单独的列。例如。 创建两个存储数字序列的字段,这些数字可以稍后提取出来,以便在PHP中进行比较。其中easykills是一个由28个字符组成的字符串,每2个字符就有一个计数器,用于计算boss被杀

  • 问题内容: 我想在数据库中存储大量声音文件,但是我不知道这是一个好习惯。我想知道这样做的利弊。 我还考虑了与这些文件建立“链接”的可能性,但这也许会带来比解决方案更多的问题。对此方向的任何经验都将受到欢迎:) 注意:数据库将是MySQL。 问题答案: 我所知道的每个存储大量大文件的系统都将它们存储在数据库的外部。您将文件的所有可查询数据(标题,艺术家,长度等)以及文件的部分路径存储在数据库中。当需