NoSQL树结构

时间:2013-10-10 09:39:33

标签: database-design nosql finance

我找到了这个问题的几个答案,但没有一个与我的问题相符。

http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/ Tree structures in a nosql database

这些示例中的大多数都模拟了“是一个”图层次结构。鞋子是一种服装。树是关于类型专业化的。

少数人建模“有”关系,不支持类型。

我最初的问题来自建模金融产品。为了简单起见: http://en.wikipedia.org/wiki/Option_style

描述

假设一个树,其中每个节点都是交换两个子节点所代表的资产的权利或义务。

例如。微软股票的欧洲看涨期权:“我有权(没有义务)以50美元的价格购买微软股票,2016年1月10日” ==>交换是在现金和股票之间。

但是也可以在另一个呼叫选项上有一个呼叫选项。 “我有权(没有义务)以2015年6月10日的11美元购买上述选项”

树的叶子必须是某些市场上的上市产品(股票,债券,利率,上市期权......),或这些产品的一些汇总篮子。

每个节点几乎可以是任何类型:

  1. 路径依赖还是回报(亚洲人,回顾......)
  2. 运动类型(百慕大,美国,欧洲)
  3. 把/呼叫
  4. 长/短
  5. 并且可能根据其类型设置非常不同的参数集,例如:

    • 百慕大运动需要一系列日期,其他只需要一个到期日。

    所以我必须对表示“有一个”关系(包括篮子/索引聚合)的树进行建模,其中每个节点可以具有非常不同的性质并且具有非常不同的参数。但我还必须在我的数据库结构中的节点之间反映某种类型的继承,美国的put选项“是一个”选项。

    Constaints

    1. 我必须有足够的信息来为预订的产品定价。给定DB +市场数据访问+选择定价模型==>价
    2. 可以假设,如果需要,将在代码级确保ACID方面
    3. 只要上面的确定,
    4. 速度是唯一的衡量标准
    5. 问题

      我有什么选择?我非常开放,甚至是文件写作和序列化,或者你可能有任何疯狂的想法。

      我只需要大脑冲击头脑风暴。

      编辑:感谢Christoph

      对于SQL中的继承,我通常会这样做

      CREATE TABLE OPTION ("isin", "name", "emitter","typeId"); "use American type id"
      CREATE TABLE AMERICAN_OPTION ("isin","foo1", "foo2");
      

      问题更多的是它的“下行链接”,例如我的美国期权基础不一定是简单的上市产品。

      CREATE TABLE ASSET ("uniqueIdentifier,"typeId","name","asset1","asset2");
      CREATE TABLE ASSET_TYPE_1 ("uniqueIdentifier","DATA_1",..."DATA_N");
      CREATE TABLE ASSET_TYPE_2 ("uniqueIdentifier","DATA_1",..."DATA_N");
      CREATE TABLE ASSET_TYPE_1_B ("uniqueIdentifier","DATA_1",..."DATA_N");
      
      ....
      

      “资产”可以在任何地方。这在大多数情况下都适用,但需要一些技巧。例如,篮子盒必须按照christoph描述的方式设计。例如,篮子上的美式期权,资产1是现金,资产2是篮子类型,并且模仿这样。

      ASSET( "XYZT12345", "American", "XYZT__1", "XYZT__2", ...[common admin data(e.g.tradedate,valuationCurrency...] )
      ASSET( "XYZT__1", "cash", "NULL", "NULL" )
      ASSET( "XYZT__2", "basket", "NULL", "NULL" )
      
      CASH_ASSET( "XYZT__1", "10$" )
      BASKET_ASSET( "XYZT__2", "Ric_1" )
      BASKET_ASSET( "XYZT__2", "Ric_2" )
      BASKET_ASSET( "XYZT__2", "Ric_3" )
      VANILLA_OPTION_ASSET( "XYZT12345", "MaturityDate", "strikePrice" ); // both european and american fit in there
      

      如果选项是bermudean / carraibean,我可能需要一个dateSet模型表

1 个答案:

答案 0 :(得分:0)

通过规范化数据可以实现对数据库中“是一种”关系的建模,即如果你有一个OPTION表和一个AMERICAN_OPTION表,那么它们可能如下所示:

(我正在切换到伪SQL,但同样适用于nosql):

CREATE TABLE OPTION ("isin", "name", "emitter");
CREATE TABLE AMERICAN_OPTION ("isin", "name", "emitter", "foo1", "foo2");

在这里,您可以将其解释为“AMERICAN_OPTION派生自OPTION并且有其他成员'foo1'和'foo2'”。

或者,您可以将所有内容放在一个表中,并将未使用的列保留为NULL。

通常通过创建数据库索引和它们之间的关系来建立“有”关系。

ETF篮子“与其他产品有1:n的关系。确保NoSQL数据库以某种方式支持1:n关系。由于许多NoSQL数据库不支持开箱即用的索引,因此您可能必须在应用程序中对这些关系进行建模。如果关系不太复杂,这通常不是什么大问题。您可以在维基百科中搜索“Star Schema”以获取更多信息。

CREATE TABLE BASKET ("id", "name", "emitter");
CREATE TABLE INSTRUMENT ("id", "name", "emitter");
CREATE TABLE BASKET_TO_INSTRUMENT("etf_id", "instrument_id"); <-- your 1:n relationship

如果你使用图形数据库,那么这些功能中的一些可能是开箱即用的,但我没有图形数据库的经验。不过,我认为它们不会更快。

在审查中,似乎NoSQL数据库的建模与SQL数据库的建模没有什么不同,但作为应用程序开发人员,您还有更多工作要做。

致以最诚挚的问候,

了Christoph