我找到了这个问题的几个答案,但没有一个符合我的问题。
http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/ nosql 数据库中的树结构
这些示例中的大多数都对“是”图形层次结构进行建模。鞋子是衣服。这棵树是关于类型专业化的。
少数几个建模“有”关系,不支持类型。
我最初的问题来自于金融产品建模。为了简单起见: http ://en.wikipedia.org/wiki/Option_style
描述
假设一棵树,其中每个节点都是交换由两个子节点表示的资产的权利或义务。
例如。微软股票的欧式看涨期权:“我有权利(没有义务)以 50 美元的价格购买微软股票,2016 年 1 月 10 日”==> 交换是在美元现金和股票之间。
但是一个人也可以在另一个看涨期权上拥有看涨期权。“我有权(无义务)以 11 美元的价格购买上述选项,2015 年 6 月 10 日”
那个树
树的叶子必须是某个市场上的上市产品(股票、债券、利率、上市期权……),或此类产品的某个聚合篮子。
每个节点几乎可以是任何类型:
- 路径依赖的回报与否(亚洲,回顾......)
- 运动类型(百慕大、美国、欧洲)
- 看跌/看涨
- 长短
并且根据其类型可能具有非常不同的参数集,例如:
- 百慕大行使将需要一系列的日期,其他的只有一个到期日。
因此,我必须对表示“具有”关系(包括篮子/索引聚合)的树进行建模,其中每个节点的性质可能非常不同,并且参数也非常不同。但我还必须在我的数据库结构中反映我的节点之间的某种类型继承,即美式看跌期权“是一个”期权。
约束
- 我必须有足够的信息来为预订的产品定价。Given DB + 市场数据访问 + 选择定价模型 ==> 价格
- 如果需要,可以假设 ACID 方面将在代码级别得到保证
- 速度是唯一的衡量标准,只要上述是好的
问题
我有什么选择?我非常开放,即使是文件写入和序列化,或者任何你可能有的疯狂想法。
我只需要大头脑风暴的大头脑风暴。
编辑:感谢克里斯托夫
对于 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 描述的方式进行设计。例如,一个篮子上的美式期权,asset1 是现金,asset2 是篮子类型,并且是这样建模的。
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 模型表