在 SQL Server 数据库中堆叠测量值的最佳方法是什么?水平还是垂直? [已关闭]

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

我有一个关于 SQL Server 数据库的设计问题。

  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个回答
1
投票

水平存储数据,然后使用数据透视将其格式化以进行垂直呈现。这遵循标准化最佳实践。

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

0
投票

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

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