我正在尝试为股票价格数据创建一个Cassandra架构。
每条记录都包含以下字段:
正如您所看到的,没有一个字段可以作为唯一标识符。
我想创建类似的东西:
Stocks { // column family
????? { //row key - unique id
symbol: 'GOOG' // column -- secondary index
date: '2005/01/01' //column -- secondary index
open: '500' //column
close: '501' //column
}
}
如您所见,我想利用cassandra 0.7中的secondary index feature。
将数据插入数据库时,我应该为每条记录创建一个TimeUUID吗?这似乎是最简单的路线。
注意:我不在金融行业工作,我只是使用这个数据集来围绕Cassandra。
答案 0 :(得分:2)
答案取决于您将如何使用数据。我假设,根据您指示的索引,您要按符号和数据进行搜索。我将进一步假设您希望能够获得给定日期的数据列表或给定符号的日期/统计数据。库存数据是静态的,因此我们无需担心我们的架构可以更新。
我们可以在这里使用单个列系列,我们将其称为“StockData”。每个符号都有一行,每个日期也是如此。因此,对于上述记录,您将拥有'GOOG'和'2005/01/01'的密钥。
对于第一种类型的键(符号),列名称将类似于“2005/01/01 01-start”和“2005/01/01-end”,列值为起始值和结束值。
对于第二种类型的键(日期),您的列名称将类似于“GOOG-start”和“GOOG-end”。同样,开始值和结束值将存储为列值。
举例说明:
Column Family: StockData
------------------------------------------------------------------------------------
GOOG | 2005/01/01-start | 2005/01/01-end | 2005/01/02-start | 2005/02/01-end |
| 500 | 501 | 501 | 600 |
APPL | 2005/01/01-start | 2005/01/01-end | 2005/01/02-start | 2005/02/01-end |
| 354 | 360 | 360 | 100 |
2005/01/01 | GOOG-start | GOOG-end | APPL-start | APPL-end |
| 500 | 501 | 354 | 360 |
2005/01/02 | GOOG-start | GOOG-end | APPL-start | APPL-end |
| 501 | 600 | 360 | 100 |
现在,您可以使用符号行上的get_slice函数为符号选择所有或部分统计信息(按日期排序)。同样,您可以获得一天的部分或全部统计数据(按符号排序)。
使用NOSQL系统,与开发人员一样,构建数据的方法几乎一样多。这绝不是唯一的方法。只是让你入门的东西。
答案 1 :(得分:1)
您需要准确解释您希望运行的查询 - 因为Cassandra没有灵活的查询语言,所以必须构建模式以适应特定查询。
您可以将股票代码用作唯一的行键,然后添加以日期作为列名称的列,并将开始和结束价格打包到复合值中。
GOOG - > {'2005/01/01':'354-360'} {'2005/01/02':360-100}
但这不会给你有用的二级索引。
正如string-literal建议的那样,您可以使用复合列名称:
GOOG - > {'2005/01/01-start':354} {'2005/01/01-end':360} ......
这样就可以对价格进行二次索引(但这在您的示例数据集中实际上并不是非常有用)。