【问题标题】:Developing a Cassandra "schema" for unique-id-less data为无唯一 ID 数据开发 Cassandra“模式”
【发布时间】:2011-07-22 06:11:28
【问题描述】:

我正在尝试为股票价格数据创建 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 进行思考。

【问题讨论】:

    标签: database-design data-modeling cassandra


    【解决方案1】:

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

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

    对于第一种类型的键(符号),您的列名将类似于“2005/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 系统,构建数据的方法几乎与开发人员一样多。这绝不是唯一的方法。只是让您入门。

    【讨论】:

    • 感谢您的详细回复。您的解决方案非常有趣,这根本不是我想象的。是否可以使用此方法轻松查询特定符号和给定日期范围?给定特定符号的行,获取日期范围的最佳方法是什么?
    • 在调查了更多之后,我不确定这是一个好的解决方案。要对行键进行范围查询,您必须使用 OrderPreservingPartitioner
    【解决方案2】:

    您需要准确地解释您希望运行的查询 - 因为 Cassandra 没有灵活的查询语言,所以架构的结构必须适合特定的查询。

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

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

    但这不会为您提供有用的二级索引。

    正如字符串文字所暗示的,您可以改用复合列名:

    GOOG -> {'2005/01/01-start':354} {'2005/01/01-end':360} ...

    这将启用对价格的二级索引(但这在您的示例数据集中实际上并不是很有用)。

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多