我试图为股票价格数据创建一个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
}
}正如你所看到的,我想利用卡桑德拉0.7中的次级索引特征。
当将数据插入数据库时,是否应该为每个记录创建一个TimeUUID?这似乎是最直截了当的路线。
注:我不是在金融业工作,我只是用这个数据集来把我的思想围绕在卡桑德拉身上。
发布于 2011-03-29 22:54:08
答案取决于您将如何使用数据。根据您所指示的索引,我假设您希望按符号和数据进行搜索。我将进一步假设您希望能够获得给定日期的数据列表或给定符号的日期/统计数据。股票数据是静态的,所以我们不需要担心我们的模式是可更新的。
我们可以在这里使用一个列家族,我们将其称为'StockData‘。每个符号都有一行,每一个日期也是如此。因此,对于上述记录,您将拥有'GOOG‘和'2005/01/01’的键。
对于第一种类型的键(符号),您的列名将类似于'2005/01/01- start‘和'2005/01/01- end’,其中列值是开始值和结束值。
对于第二种类型的键(日期),您的列名应该是“GOOG”和“GOOG”。同样,开始值和结束值将作为列值存储。
为了说明:
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系统,您的数据结构的方式几乎和开发人员一样多。这不是唯一的办法。只是为了让你开始。
发布于 2011-04-13 22:09:25
您需要精确地解释您想要运行的查询--因为Cassandra没有灵活的查询语言,所以必须构造适合特定查询的模式。
您可以使用股票符号作为唯一的行键,然后添加以日期作为列名的列,并将开始和结束价格打包为复合值。
GOOG -> {'2005/01/01':'354-360'} {'2005/01/02':360-100}
但这不会给你提供有用的二级索引。
正如字符串-文字所暗示的,您可以使用复合列名来代替:
GOOG -> {‘2005/01/01-开始’:354}{‘2005/01/01-结束’:360}
这将允许对价格进行二级索引(但这在示例数据集中并不是很有用)。
https://stackoverflow.com/questions/5421702
复制相似问题