SQL 具有 M 个参数随时间变化的 N 个项目的数据库结构
SQL DB structure for N items with M parameters varying over time
有以下项目:
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 代码?
我可能会采用这样的结构:
我会提供 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, MeasurementDate, Param3) values (1, DATEADD(day, 3, GetDate()), 'red')
INSERT INTO #Measurements (ItemID, MeasurementDate, Param3) values (1, DATEADD(day, 2, GetDate()), 'blue')
INSERT INTO #Measurements (ItemID, MeasurementDate, Param2) values (0, DATEADD(day, 5, GetDate()), 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
输出:
查询所有项目所有参数的最新值":
代码(见解释):
SELECT TOP 1 WITH TIES
*
FROM #Measurements
ORDER BY row_number() over (partition by ItemID order by MeasurementDate desc)
输出:
有以下项目:
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 代码?
我可能会采用这样的结构:
我会提供 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, MeasurementDate, Param3) values (1, DATEADD(day, 3, GetDate()), 'red')
INSERT INTO #Measurements (ItemID, MeasurementDate, Param3) values (1, DATEADD(day, 2, GetDate()), 'blue')
INSERT INTO #Measurements (ItemID, MeasurementDate, Param2) values (0, DATEADD(day, 5, GetDate()), 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
输出:
查询所有项目所有参数的最新值":
代码(见解释
SELECT TOP 1 WITH TIES
*
FROM #Measurements
ORDER BY row_number() over (partition by ItemID order by MeasurementDate desc)
输出: