我有应该存储在 MSSQL 服务器中的整数到期日的收益率曲线数据。
货币.csv
目前,数据按货币存储在 CSV 文件中,格式如下:
date, 1y, 2y, 3y, ...
08/12/2020, 0.4, 0.5, 0.6, ...
我想知道桌子的最佳选择是什么。
相同格式表
当前数据可以直接转换为带有列的表:
+------------+------+------+------+------+
| date | 1y | 2y | 3y | ... |
+------------+------+------+------+------+
| 08/12/2020 | 0.4 | 0.5 | 0.6 | ... |
+------------+------+------+------+------+
备用表设计
但是,我也可以像这样存储它:
+------------+-----------+-----------+--------+
| date | currency | maturity | value |
+------------+-----------+-----------+--------+
| 08/12/2020 | "EUR" | 1 | 0.4 |
| 08/12/2020 | "EUR" | 2 | 0.5 |
| 08/12/2020 | "EUR" | 3 | 0.6 |
+------------+-----------+-----------+--------+
显然,第二种方法将比第一种方法占用更多空间,但我会看到我不会限制到期值的优势,以防将来它应该更改为非整数值或到期有一个专栏呢。
两种桌子设计哪个更好?还有其他更适合的设计吗?
由于您概述的原因,您的第二个选择(长)是可取的,前提是您使用正确的键和约束。
像这样的事情可能是正确的方向:
这里通过主键选择复合聚集索引形式
(CurrencyCd, AsOfDt, MaturityAgeYr)
确保数据将(或多或少)根据这些列排序存储。这意味着该类型的任何查询WHERE CurrencyCd = 'EUR'
都只会读取相关页面。这种选择聚集索引 + 以“长”格式存储数据将使“扩展”数据变得微不足道 - 因此,如果您需要按照第一个示例中提供的方式查看数据,这很简单
PIVOT
。其他注意事项: