Разработка "схемы" Cassandra для данных без уникальных идентификаторов - PullRequest
2 голосов
/ 24 марта 2011

Я пытаюсь создать схему Кассандры для данных о цене акций.

Каждая запись имеет следующие поля:

  • символ акции
  • дата
  • цена открытия
  • цена закрытия

Как видите, нет ни одного поля, которое могло бы выступать в качестве уникального идентификатора.

Я бы хотел создать что-то вроде:

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 для каждой записи?Это кажется самым простым маршрутом.

Примечание: я не работаю в финансовой индустрии, я просто использую этот набор данных, чтобы сосредоточиться на Кассандре.

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Ответ зависит от того, как вы будете использовать данные. На основании индексов, которые вы указываете, я предполагаю, что вы хотите искать по символу и данным. Далее я предполагаю, что вы хотите иметь возможность получить список данных за определенную дату или даты / статистику для данного символа. Данные о запасах статичны, поэтому нам не нужно беспокоиться о возможности обновления нашей схемы.

Здесь мы можем работать с семейством из одного столбца, которое мы будем называть 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 существует столько же способов структурировать ваши данные, сколько и разработчиков. Это ни в коем случае не единственный способ. Просто кое-что, чтобы вы начали.

1 голос
/ 14 апреля 2011

Вам необходимо точно объяснить, какие запросы вы хотите запускать - поскольку у Cassandra нет гибкого языка запросов, схема должна быть структурирована для соответствия конкретным запросам.

Вы можете использовать символ акции в качестве уникальногоключ строки, затем добавьте столбцы с датой в качестве имени столбца, а начальная и конечная цена упакованы в составное значение.

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

Но это не даст вам полезной вторичной индексации.

Как подсказывает строковый литерал, вы можете вместо этого использовать имя составного столбца:

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

И это включит вторичныйиндексирование цен (но на самом деле это не очень полезно в вашем примере набора данных).

...