【问题标题】:Best way to represent a 4d table in database (oracle)在数据库中表示 4d 表的最佳方法(oracle)
【发布时间】:2012-12-12 03:41:27
【问题描述】:

我正在开发一个金融应用程序,用于对一堆证券进行情景分析。 “场景”非常简单,它们采用某些输入(在我的情况下,特别是两个,比如 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 为 Table O 的 4 维表展平为 (security_id, A_shock_id, B_shock_id),其中 A_shock_idB_shock_idTable S 的 FK。这种方式的明显缺点是,如果我想添加其他可冲击输入,它不灵活(因为冲击输入被硬编码为列)。

是否有更灵活/标准的方式来表示此类数据?还是这是规范化数据库的限制?

【问题讨论】:

  • 你说,“基本上我已经通过引入 2 个外键来扁平化 4-d 表......”不,你没有。您的“扁平化”结构与直接在“表 O”中使用冲击值(我假设为 0.10、0.20 等)的结构之间基本上没有区别。
  • 好点,你。编辑以实际说出我的意思。

标签: sql oracle normalization


【解决方案1】:

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

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

  • 证券
  • 可调参数

还有 20 个输出指标。

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

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

【讨论】:

  • 检查我是否理解正确。您正在谈论的“参数表”是否是一个半静态表,它定义了不同参数上的冲击的不同排列(每一行可以被认为是一个向量,它定义了每个坐标上的冲击值,它代表每个参数震惊了多少)?那么输出表的PK可以是(security_id, row_in_parameter_table)。向shock 添加一个新参数就像添加一个新列(默认值为0)并插入新的排列一样简单。
  • 是的,你理解正确。参数集是一个对象,应该这样建模。您必须修改参数集表以添加新参数。 (您可以对这些进行规范化,但对于这种很少更改的属性而言,这可能是规范化步骤太远了。)
【解决方案2】:

另一个解决方案可能是完全规范化架构,通过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
...

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

【讨论】:

  • 如果我有多个可以“震惊”的输入怎么办?您的解决方案绝对适用于我上面提出的问题。只是好奇您将如何添加更多震惊的输入(即向输出表添加维度)。如果我有 A、B、C 电击输入怎么办?输出表现在将是 5 维的。
  • 我没有完全满足您的需求,我已经编辑了答案以向您展示更合适的模型,我希望现在提供了正确且合适的架构。
  • 这很清楚,你!有点类似于上面的建议。
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2013-07-10
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多