0

我正在开发一个对一堆证券进行情景分析的金融应用程序。“场景”非常简单,它们采用某些输入(在我的情况下,特别是两个,比如 A 和 B)并“冲击”它们(即乘以 10%、20%、30% 等)然后计算输出(我有大约 20 种不同的输出指标)。

这会产生一个 4-d 表,其中:

  1. x 轴是输入 A 的冲击(10%A、20%A、30%A 等)
  2. y 轴是输入 B 的冲击(10%B、20%B、30%B 等)
  3. z 轴是 20 个不同的输出指标
  4. w轴是不同的证券

我想将此表保存到数据库(oracle)中。我这样做的方法是有 2 张桌子:

  1. Table S对于输入的冲击水平(百分比)
  2. Table O安全与输出

这是每个表的样子:

 Table S
 -------------------------
 shock_id    shock_value
 0           0%
 1           10%
 2           20%
 3           30%
 4           40%
 ...   ...

 Table O
 --------------------------
 security_id   A_shock_id   B_shock_id   output_1   output_2 
 1             0            0            1.2        2.3
 1             1            0            1.34       3.52
 1             2            0            2.4        3.98
 1             3            0            3.42       5.31
 1             4            0            23.2       133.1
 1             0            1            2.2        32.1
 1             0            2            23.1       4.2
 1             0            3            ...        ...
 ...           ...          ...          ...        ...

基本上我已经将 PK 的 4-d 表弄平了,Table O(security_id, A_shock_id, B_shock_id)whereA_shock_idB_shock_idare FKs to Table S。这种方式的明显缺点是,如果我想添加其他可冲击输入,它不灵活(因为冲击输入被硬编码为列)。

有没有更灵活/标准的方式来表示这样的数据?或者这是规范化数据库的限制?

4

2 回答 2

3

这是否是关系数据库的限制或特性绝对是一个悬而未决的问题。但是,是的,关系数据库旨在将“已知”数据映射到具有它们之间关系的表/集合中。大多数涉及关系数据库的项目都从数据建模开始,作为该过程中的正式或非正式步骤。

您提出的问题很容易映射到关系技术。你太专注于结果的输出了。您似乎有两种类型的输入:

  • 证券
  • 可调参数

以及 20 个输出指标。

您应该以与执行输出指标相同的方式将可调整参数编码为具有不同列的表。参数集表将从两列开始:Shock_A 和 Shock_B。我还将包括一个“类型”列,这样您就知道准确地期望这两个参数。添加其他变量就像在此表中添加一列一样简单。

这种结构不是纯粹标准化的。一种无法很好地映射到大多数 SQL 引擎的关系类型是 one-of 关系。参数集就是一个例子。具有不同参数的“类型”列是表示此结构的适当方式。

于 2012-12-26T16:14:23.863 回答
1

另一种解决方案可能是完全规范化模式,通过InputTypes具有列IdDescription. 在您的情况下,表格将显示如下:

Table InputTypes
-----------------------
Id   Description
0    A
1    B
...

在另一个表格中ShockCombinations,您可能会有不同的冲击组合,如下所示:

Table ShockCombinations
-----------------------------
Id InputType_Id ShockValue
1  0            10%
1  1            20%
2  0            0%
2  1            10%
....

在表中OutputTypes,您可以有不同的输出类型:

Table OutputTypes
-----------------------------
Id Description
1  Output1
2  Output2
....

这样表O可以具有以下结构:

Table O
--------------------------
security_id   ShockCombination_id   OutputType_id Values 
1             1                     1             1.2
1             1                     2             2.3
1             2                     1             1.34
1             2                     2             1.77
...

这样,您可以处理的输入组合和输出的数量没有限制,并且您可以轻松添加新的输入类型、它们的组合和输出,而无需修改您的模式。

于 2012-12-26T16:21:29.090 回答