Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design “开发卡桑德拉”;“模式”;对于唯一的无id数据_Database Design_Data Modeling_Cassandra - Fatal编程技术网

Database design “开发卡桑德拉”;“模式”;对于唯一的无id数据

Database design “开发卡桑德拉”;“模式”;对于唯一的无id数据,database-design,data-modeling,cassandra,Database Design,Data Modeling,Cassandra,我正在尝试为股票价格数据创建一个Cassandra模式 每个记录都有以下字段: 股票代码 日期 开盘价 收盘价 正如您所看到的,没有一个字段可以充当唯一标识符 我想创建如下内容: Stocks { // column family ????? { //row key - unique id symbol: 'GOOG' // column -- secondary index date: '2005/01/01' //column

我正在尝试为股票价格数据创建一个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?这似乎是最直接的路线


注意:我不在金融行业工作,我只是用这个数据集来概括我对卡桑德拉的看法。

答案取决于你将如何使用这些数据。我假设,根据您指示的索引,您希望按符号和数据进行搜索。我将进一步假设您希望能够获得给定日期的数据列表或给定符号的日期/统计数据。股票数据是静态的,所以我们不需要担心我们的模式是可更新的

我们可以在这里使用一个列族,我们称之为“StockData”。每个符号都有一行,每个日期都有一行。因此,对于上述记录,您将拥有'GOOG'和'2005/01/01'键

对于第一种类型的键(符号),列名类似于“2005/01/01开始”和“2005/01/01结束”,列值为开始值和结束值

对于第二种类型的键(日期),您的列名类似于“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系统,构建数据的方法几乎和开发人员一样多。这绝不是唯一的办法。您需要准确地解释您希望运行的查询-因为Cassandra没有灵活的查询语言,所以架构必须适合特定的查询

您可以使用股票符号作为唯一的行键,然后添加以日期为列名的列,并将开始和结束价格打包为复合值

GOOG->{'2005/01/01':'354-360'}{'2005/01/02':360-100}

但这并不能为您提供有用的二次索引

正如string literal所建议的,您可以使用复合列名:

GOOG->{'2005/01/01开始:354}{'2005/01/01结束:360}


这将支持对价格进行二次索引(但在您的示例数据集中,这实际上不是很有用)。

感谢您的详细回复。你的解决方案很有趣,根本不是我想象的那样。使用此方法是否可以轻松查询特定符号和给定日期范围?给定特定符号的行,获取日期范围的最佳方法是什么?在进一步研究之后,我不确定这是否是一个好的解决方案。要对行键执行范围查询,必须使用OrderPreservingPartitioner