Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在sql server中存储定时数据点_Sql Server_Time Series - Fatal编程技术网

Sql server 如何在sql server中存储定时数据点

Sql server 如何在sql server中存储定时数据点,sql-server,time-series,Sql Server,Time Series,我需要在数据库(SQL server)中存储点列表,我不确定我选择的选项是否是最佳解决方案 这些数据点是非常基本的,一个十进制值,表示时间t的测量值,一个基本时间戳,它只是一个int,表示从测量开始算起的秒数 在我的域中,我有一个Measurement类,它将包含这些数据点的列表 我现在有一个MeasurementValue表 MeasurementValue ---------------- TimeStamp INT PK MeasurementId INT PK + FOREIGN KEY

我需要在数据库(SQL server)中存储点列表,我不确定我选择的选项是否是最佳解决方案

这些数据点是非常基本的,一个十进制值,表示时间t的测量值,一个基本时间戳,它只是一个int,表示从测量开始算起的秒数

在我的域中,我有一个
Measurement
类,它将包含这些数据点的列表

我现在有一个
MeasurementValue

MeasurementValue
----------------
TimeStamp INT PK
MeasurementId INT PK + FOREIGN KEY on Measurement
Value DECIMAL
一次测量大约有1000个数据点,测量的数量可能会有几百个,我会说,可能有几千个

我并不真正关心能够查询这个
MeasurementValue
表,它总是作为一个整体


我知道包含此表的点数可能很小,可以通过此设计进行管理,但我想知道,如果这些点数将来会增加,是否有更好的替代方案。

根据您的问题和评论,您可以选择以下选项之一

第一个是你的普通桌子设计

MeasurementValue
----------------
TimeStamp datetime PK
MeasurementId int PK + FOREIGN KEY on Measurement
Value DECIMAL
若要查询值列并在数据库中对其进行操作,请选择此项

MeasurementValue
----------------
TimeStamp datetime PK
MeasurementId int PK + FOREIGN KEY on Measurement
Value varchar(8000) comma separated int values.
若您不打算查询值列并在数据库中对其进行操作,请选择此选项

从您的问题来看,从存储和查询速度选项来看,第二种设计更适合您。 您还可以选择将测量值存储为与上次测量值的差值,而不是从开始时间戳开始的测量值。见下面的例子

Measurent Values difference  from start timestamp
1,2,10,12,20
Measurent Values difference from last measurement
1,1,8,2,8
这将使您的值列更小,因此varchar(8000)更有可能容纳您的所有值

Gimly, 你有两个选择。一种是按照您的建议创建一个表。尽管你可能想稍微改变一下(尽管这个改变很重要)

实体属性值如下所示

MeasurementID PK FK
TimeStamp PK
Value
一些SQL人员非常反对EAV;然而,当它有意义时,它就有意义。 这很好,因为您只在需要时返回数据。只需加入到表中并称其为好的。在这种情况下,对于这样的小数据类型,您将能够在一个页面上容纳大量的行。我可能不会担心聚集索引,除非measurementID行总是按顺序插入。在MeasurementID周围有一个维护的非聚集索引的堆应该可以很好地工作

EDIT-ADDED:无论是集群还是非集群,度量值都需要在索引中放在第一位。原因是您希望时间戳与度量分组,而不是与时间戳分组的度量。IE根据测量值选择所有时间戳,而不是根据时间戳选择所有测量值

另一个选项也会起作用,但我建议您首先进行测试,就像您建议将数据内联到测量表中一样。使用XML,您可能不需要遍历并生成模式文件,但这是一种内联保持关系的方法

MeasurementID, Col1, Col2, col3, MeasurementDetailXML
并将XML列设置为 行外大值类型=开

这将把大列从常规数据页中推出。仅在需要时选择列。有很多关于SQL中XML的好文章,我通常会回到这篇;

您的XML可能如下所示:

<MeasurementDetail>
  <TimeStamp> </TimeStamp>
  <Value> </Value>
</MeasurementDetail>
<MeasurementDetail>
  <TimeStamp> </TimeStamp>
  <Value> </Value>
</MeasurementDetail>
....

....
有许多方法可以形成XML文档,所以可以使用您觉得合适的任何方法

在实践中,不要让事情变得过于复杂。我建议编写一个EAV表,这仅仅是因为它易于开发、维护,并且其他人能够快速获取代码


有许多正确的答案,所以请选择最简单的答案,除非您证明它不足以满足业务需要。

我认为通用表的设计完全规范化并且很好。您的十进制值的范围和精度是多少?数据类型的默认大小可能大于您的要求。网上查书

从技术上讲,数据库中的每一列都可以命名为“Value”。我可能会将列名更改为更能表示实际数据的名称

我建议不要将你的值去规范化。是的,它可以提高数据检索性能(检索一个大行,而不是大量的小行,所有这些索引列的开销都很高),但是您必须解析blob,那么您实际节省了多少时间?如前所述,使用带分隔符的值列表会丢失单个时间戳(并且您必须担心为分隔的十进制值留出了足够的空间),如果使用XML,为什么还要使用关系数据库呢

关于索引,我没有明确的答案,只有几个设计问题

如果查询时总是从表中检索所有数据,那么索引在很大程度上是不相关的(主键强制执行除外)。然而,这意味着您需要所有实验的所有测量值……这似乎不太可能

规划问题:您的数据的截止日期是什么?一旦加载,它会永远留在那里,还是最终会从系统中删除?今天发展很快的东西在一年后的生产中往往是可怕的

正在批量加载数据。这些数据是按顺序排列的,还是按随机顺序排列的?加载性能(和潜在的表锁定)是至关重要的,还是不那么相关

我下意识的反应是对(MeasurementId,TimeStamp)进行聚集索引。然而:

  • 如果MeasurementId是第一列,则对给定度量的所有值的查询(和删除)将非常快
  • 只有当数据已按索引顺序排序时,批量加载到聚集索引中才有效
  • 如果没有排序,或者以后添加了数据,您将得到页面拆分