Sql 对于具有异构属性的金融时间序列数据,最合适的数据库技术是什么?

Sql 对于具有异构属性的金融时间序列数据,最合适的数据库技术是什么?,sql,database-design,Sql,Database Design,我需要存储大量金融时间序列数据,其中不同的数据点具有潜在的不同属性 例如,考虑一个情况,数据库需要存储包括股票和期权在内的一系列金融工具。股票和期权在任何给定的时间点都有价格,但期权具有附加属性,如希腊语(delta、gamma、vega)等 在这里,关系数据库似乎最合适,一种可能是为每个属性创建一列,并将未使用的属性设置为NULL。因此,在上面的例子中,对于表示股票的记录,您将只使用一些列,而对于期权,您将使用一些其他列 这种方法的问题是效率非常低(最终会存储大量空值),而且非常不灵活(每次添

我需要存储大量金融时间序列数据,其中不同的数据点具有潜在的不同属性

例如,考虑一个情况,数据库需要存储包括股票和期权在内的一系列金融工具。股票和期权在任何给定的时间点都有价格,但期权具有附加属性,如希腊语(delta、gamma、vega)等

在这里,关系数据库似乎最合适,一种可能是为每个属性创建一列,并将未使用的属性设置为NULL。因此,在上面的例子中,对于表示股票的记录,您将只使用一些列,而对于期权,您将使用一些其他列

这种方法的问题是效率非常低(最终会存储大量空值),而且非常不灵活(每次添加或删除属性时都需要添加或删除列)

一种替代方法可能是将所有属性存储在垂直表中(即键名值),但其缺点是强制您将所有属性类型设置为不安全(例如,它们可能都存储为字符串)

我想到的另一个选择可能是将属性作为XML文档存储在时间序列表的单个列中。我测试了这种方法,从性能的角度来看,它是不切实际的。如果要提取更多时间序列记录的属性,则解析每行中的XML速度太慢

理想的数据库技术是NoSQL和RDBMS之间的组合,其中关键时间戳对的行为类似于关系表数据库中的一行,但所有属性都存储在一个行级包中,可以快速访问每个属性

有人知道这样一个系统吗?对于存储我描述的数据类型,还有其他建议吗?

另一个选项。 主表与相似对象属性的附属表(考虑面向对象的继承)。基于主表的主键作为相关表中的主键,主表和子表之间存在1-1关系

另一种选择。 主表与相似对象属性的附属表(考虑面向对象的继承)。基于主表的主键作为相关表中的主键,主表和子表之间存在1-1关系

使用“金融工具”存储所有金融工具共有的信息。使用“库存”存储仅适用于库存的属性;“选项”用于存储仅适用于选项的属性

create table financial_instruments (
  inst_id integer primary key,
  inst_name varchar(57) not null unique, 
  inst_type char(1) check (inst_type in ('s', 'o')),
  other_columns char(1), -- columns common to all financial instruments
  unique (inst_id, inst_type) -- required for the FK constraint below.
);

create table stocks (
  inst_id integer primary key,
  inst_type char(1) not null default 's' check (inst_type = 's'),
  other_columns char(1), -- columns unique to stocks.
  foreign key (inst_id, inst_type) references financial_instruments (inst_id, inst_type)
);

create table options (
  inst_id integer primary key,
  inst_type char(1) not null default 'o' check (inst_type = 'o'),
  other_columns char(1), -- columns unique to options; delta, gamma, vega.
  foreign key (inst_id, inst_type) references financial_instruments (inst_id, inst_type)
);
为了简化编程工作,您可以构建可更新的视图,将“financial_instruments”与其每个子类型连接起来。应用程序代码只能使用视图

存储所有金融工具相关信息的附加表将设置对“金融工具”的外键引用。例如,包含股票相关信息的表将外键引用设置为“股票”。“inst_id”。

使用“financial_instruments”存储所有金融工具共有的信息。使用“库存”存储仅适用于库存的属性;“选项”用于存储仅适用于选项的属性

create table financial_instruments (
  inst_id integer primary key,
  inst_name varchar(57) not null unique, 
  inst_type char(1) check (inst_type in ('s', 'o')),
  other_columns char(1), -- columns common to all financial instruments
  unique (inst_id, inst_type) -- required for the FK constraint below.
);

create table stocks (
  inst_id integer primary key,
  inst_type char(1) not null default 's' check (inst_type = 's'),
  other_columns char(1), -- columns unique to stocks.
  foreign key (inst_id, inst_type) references financial_instruments (inst_id, inst_type)
);

create table options (
  inst_id integer primary key,
  inst_type char(1) not null default 'o' check (inst_type = 'o'),
  other_columns char(1), -- columns unique to options; delta, gamma, vega.
  foreign key (inst_id, inst_type) references financial_instruments (inst_id, inst_type)
);
为了简化编程工作,您可以构建可更新的视图,将“financial_instruments”与其每个子类型连接起来。应用程序代码只能使用视图


存储所有金融工具相关信息的附加表将设置对“金融工具”的外键引用。如果表中只包含股票相关信息,则会将外键引用设置为“stocks”。“inst_id”。

null不会占用数据库中的任何空间,因此效率低下。例如,您是否考虑过每个属性/属性组一个表?它将加快查询时间,而不是垂直查询,并且如果要添加某些内容,则无需更改可能正在使用的表。EAV表对于类型安全以及排序/搜索(索引中通常按顺序排列的内容可能不会更改,从而影响性能)非常糟糕。也不可能(有意义地)强制执行外键关系-您可以关闭
-
名称
列,但无法要求值有效。。。我不管你有多好,总有一天会发生的。我不知道有什么特别的,但我想我看到了一个混合系统。否则,我会按照建议使用主/子表。空值不占用数据库中的空间,因此效率不高。例如,您是否考虑过每个属性/属性组一个表?它将加快查询时间,而不是垂直查询,并且如果要添加某些内容,则无需更改可能正在使用的表。EAV表对于类型安全以及排序/搜索(索引中通常按顺序排列的内容可能不会更改,从而影响性能)非常糟糕。也不可能(有意义地)强制执行外键关系-您可以关闭
-
名称
列,但无法要求值有效。。。我不管你有多好,总有一天会发生的。我不知道有什么特别的,但我想我看到了一个混合系统。否则,正如建议的那样,我会转向主/子表。每个属性或属性组(主-子)都有一个单独的表当然可以在这里工作,但管理查询的复杂性会显著增加,因为现在您需要知道每个属性(所有属性之间的左连接)要查询哪个表。这当然有效,但并不理想。我知道在关系数据库中处理这个问题的各种方法。然而,我觉得在这种特殊情况下,RDBMS是错误的工具