NoSQL 树结构
Posted
技术标签:
【中文标题】NoSQL 树结构【英文标题】:NoSQL tree structure 【发布时间】:2013-10-10 09:39:32 【问题描述】:我找到了这个问题的多个答案,但没有一个与我的问题相符。
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 日” ==> 美元现金和股票之间的交换。
但也可以在另一个看涨期权上拥有看涨期权。 “我有权(无义务)以 11 美元的价格购买上述选项,2015 年 6 月 10 日”
树
树的叶子必须是某个市场上的上市产品(股票、债券、利率、上市期权......),或此类产品的某个聚合篮子。
每个节点几乎可以是任何类型:
-
路径依赖的回报与否(亚洲,回顾...)
运动类型(百慕大、美国、欧洲)
看跌/看涨
长/短
并且根据其类型可能具有非常不同的参数集,例如:
百慕大的行使将需要一系列日期,其他的只需要一个到期日期。所以我必须建模一棵树来表达“具有”关系(包括篮子/索引聚合),其中每个节点可以具有非常不同的性质并且具有非常不同的参数。但我还必须在我的数据库结构中反映我的节点之间的某种类型继承,即美式看跌期权“是一个”期权。
约束
-
我必须有足够的信息来为预订的产品定价。 Given DB + 市场数据访问 + 选择定价模型 ==> 价格
如果需要,可以假设 ACID 方面将在代码级别得到保证
速度是唯一的衡量标准,只要以上都OK
问题
我有什么选择?我非常开放,即使是文件写入和序列化,或者任何你可能有的疯狂想法。
我只需要一次大头脑风暴的大头脑风暴。
编辑:感谢克里斯托夫
对于 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 模型表
【问题讨论】:
【参考方案1】:可以通过规范化数据来对数据库中的“is a”关系建模,即如果您有一个 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 数据库不支持开箱即用的索引,因此您可能必须在应用程序中对这些关系进行建模。如果关系不太复杂,这通常没什么大不了的。您可以在 wikipedia 中搜索“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 数据库的建模没有什么不同,但作为应用程序开发人员,您还有更多工作要做。
最好的问候,
克里斯托夫
【讨论】:
以上是关于NoSQL 树结构的主要内容,如果未能解决你的问题,请参考以下文章
在Delphi中,使用TreeView创建结构树,何种方法最好?