在 MSSQL 数据库中堆叠测量值的最佳方法是什么?水平还是垂直?

问题描述 投票:0回答:2

我有一个 MSSQL 数据库的设计问题

  1. 鉴于我有 20 个电台。 A站到T站
  2. 每个都有每 15 分钟一次的测量值(浮动)和时间戳。 M1-M100.

保存数据的最佳方式是什么? 水平存放:

车站名称 时间戳 测量名称 测量名称
A 2024年1月10日 00:00 M1 10.2
A 2024年1月10日 00:15 M1 10.1
A 2024年1月10日 00:15 M2 10.3
A 2024年1月10日 00:15 M3 10.4
B 2024年1月10日 00:00 M2 8.7

垂直存放:

车站名称 时间戳 M1 M2 M3 M4 ..等等
A 2024年1月10日 00:00 10.2 10.4 9.3 7.2
A 2024年1月10日 00:15 10.1 10.3 10.4 7.2
B 2024年1月10日 00:15 10.2 8.7 9.3 7.2

出于演示目的,数据在仪表板中需要采用垂直格式,因此即使我水平保留数据,我也需要每次为应用程序重新排列它。垂直存储是不好的做法吗?如果表格在水平或垂直方向较长,性能如何?垂直会占用很多列,水平会使用 100 倍的行。 任何意见表示赞赏

sql sql-server database database-design
2个回答
0
投票

水平存储数据,然后使用数据透视将其格式化以进行垂直演示

CREATE TABLE [Measurment] 
(
    [Station Name]  VARCHAR(512),
    [Timestamp] VARCHAR(512),
    [Name]  VARCHAR(512),
    [Value] NUMERIC(5,1),
);

--Insert examples
INSERT INTO [Measurment] ([Station Name], [Timestamp], [Name], [Value]) VALUES
    ('A', '10.1.2024 00:00', 'M1', '10.2'),
    ('A', '10.1.2024 00:15', 'M1', '10.1'),
    ('A', '10.1.2024 00:15', 'M2', '10.3'),
    ('A', '10.1.2024 00:15', 'M3', '10.4'),
    ('B', '10.1.2024 00:00', 'M2', '8.7');

Print 'Verify records inserted into the Measurment table'
SELECT * FROM Measurment

Print'Pivot on measurment names'
SELECT [Station Name], [Timestamp], [M1], [M2], [M3]  
FROM  
(
  SELECT [Station Name], [Timestamp], [Name], [Value]
  FROM Measurment
) AS SourceTable  
PIVOT  
(  
  MAX(Value)  
  FOR [Name] IN ([M1], [M2], [M3])  
) AS PivotTable;  

小提琴

车站名称 时间戳 M1 M2 M3
A 2024 年 1 月 10 日 00:00 10.2
B 2024 年 1 月 10 日 00:00 8.7
A 2024 年 1 月 10 日 00:15 10.1 10.3

-1
投票

在大多数情况下,垂直排列更有利于 MSSQL 数据库的可扩展性和灵活性。

© www.soinside.com 2019 - 2024. All rights reserved.