N项的SQL DB结构,M参数随时间变化

问题描述

有物品:

  • item_1
  • ...
  • item_N

N大约是几百。有时可以添加新项目。

每个项目都有一组参数:

  • parameter_1
  • ...
  • parameter_M
M约为20-30。这些参数一天要测量几次(彼此独立,在不同的时间),并且需要存储在数据库中。因此parameter_j(item_i)具有大量的时间-值对:
  • <t0,v0>(对parameter_j(item_i)的首次测量)
  • ...
  • <tk,vk>(对parameter_j(item_i)的最新度量)

需要执行的基本查询:

  • 项目参数的所有值(按测量时间排序)
  • 所有项目的所有参数的最新值

我需要什么数据库结构(表)来有效地执行这些查询?您能为这两种查询提供SQL代码吗?

解决方法

我可能会采用这样的结构:

Structure of tables

我将提供MS SQL代码。

用于创建这些表的示例代码:

IF NOT OBJECT_ID('tempdb..#Items') IS NULL DROP TABLE #Items
CREATE TABLE #Items (
    ID int NOT NULL,ItemName varchar(255) NOT NULL,PRIMARY KEY (ID)
)

IF NOT OBJECT_ID('tempdb..#Measurements') IS NULL DROP TABLE #Measurements
CREATE TABLE #Measurements (
    ItemID int NOT NULL,MeasurementDate datetime NOT NULL,Param1 varchar(255),Param2 float,Param3 varchar(255),ParamN binary
    FOREIGN KEY (ItemID) REFERENCES #Items (ID)
)

我通过以下代码填充了伪数据:

INSERT INTO #Items values ( 0,'Item1' )
INSERT INTO #Items values ( 1,'Item2' )

INSERT INTO #Measurements (ItemID,MeasurementDate,Param2) values (0,GetDate(),2.3)

INSERT INTO #Measurements (ItemID,Param3) values (1,DATEADD(day,3,GetDate()),'red')

INSERT INTO #Measurements (ItemID,2,'blue')

INSERT INTO #Measurements (ItemID,5,4.0)

查询,,某项参数的所有值(按测量时间排序)“:

代码:

SELECT #Measurements.MeasurementDate,#Measurements.Param2
FROM #Measurements INNER JOIN #Items ON #Measurements.ItemID = #Items.ID
WHERE #Items.ItemName LIKE '%Item1%'
ORDER BY #Measurements.MeasurementDate

输出:

enter image description here

查询,所有项目的所有参数的最新值”:

代码(请参见说明SQL Server get latest value by date):

SELECT TOP 1 WITH TIES
*
FROM #Measurements
ORDER BY row_number() over (partition by ItemID order by MeasurementDate desc)

输出:

enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...