我有一个关于 SQL Server 数据库的设计问题。
哪种方式保存数据最好?
水平存放:
车站名称 | 时间戳 | 测量名称 | 测量名称 |
---|---|---|---|
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倍的行。
任何意见表示赞赏
水平存储数据,然后使用数据透视将其格式化以进行垂直呈现。这遵循标准化最佳实践。
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 |
在大多数情况下,垂直排列更有利于 MSSQL 数据库的可扩展性和灵活性。