2016-01-13 6 views
1

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

"source = 'abc' and created_at >= '2016-01-01 00:00:00'"? 

CREATE TABLE articles (
    id text, 
    source text, 
    created_at timestamp, 
    category text, 
    channel text, 
    last_crawled timestamp, 
    text text, 
    thumbnail text, 
    title text, 
    url text, 
    PRIMARY KEY (id) 
) 

Я хотел бы моделировать свою систему в соответствии с этим: http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/

Edit:

Что мы делаем очень подобно тому, что вы предлагаете. Разница заключается в том, что наш первичный ключ не имеет скобок вокруг источника: PRIMARY KEY (source, created_at, id). У нас также есть два других показателя:

CREATE INDEX articles_id_idx ON crawler.articles (id); 
CREATE INDEX articles_url_idx ON crawler.articles (url); 

Наша система очень медленная, как эта. Что ты предлагаешь?

Спасибо за ваши ответы!

+0

Это все еще зависит от того, сколько источников источника может иметь и сколько записей будет вставлено. –

+2

Без обид для Джей Пател; эта статья была * отлично * для своего времени и помогла создать основу для обучения разработчиков на правильном моделировании данных Cassandra. Но это почти 4 года, и не так важно, как когда-то (Кассандра изменила * много * в то время). – Aaron

+0

@Aaron Спасибо за ответ. Я добавил, что редактирование нашего сообщения было бы здорово, если бы вы могли предложить что-то, потому что предлагаемое вами решение похоже на то, что мы делаем сейчас, но наша система все еще очень медленная. – peter

ответ

4

Учитывая структуру таблицы

CREATE TABLE articles (
    id text, 
    source text, 
    created_at timestamp, 
    category text, 
    channel text, 
    last_crawled timestamp, 
    text text, 
    thumbnail text, 
    title text, 
    url text, 
    PRIMARY KEY ((source),created_at, id) 
) 

Вы можете оформить следующие запросы:

SELECT * FROM articles WHERE source=xxx // Give me all article given the source xxx 

SELECT * FROM articles WHERE source=xxx AND created_at > '2016-01-01 00:00:00'; // Give me all articles whose source is xxx and created after 2016-01-01 00:00:00 

Пара (created_at, идентификатор) в первичном ключе здесь, чтобы гарантировать статью единственность. В самом деле, можно иметь, в то же created_at время, 2 разные статьи

+2

Хороший ответ! Эта модель также будет поддерживать запрос диапазона на 'created_at', например:' SELECT * FROM articles WHERE source = 'abc' AND created_at> = '2016-01-01 00:00:00' AND 'created_at <' 2016-01 -05 00: 00: 00 '; ' – Aaron

+0

@doanduyhai Что мы делаем, очень похоже на то, что вы предлагаете. Разница заключается в том, что у нашего первичного ключа нет скобок вокруг источника: PRIMARY KEY (source, created_at, id). У нас также есть два других индекса: CREATE INDEX articles_id_idx ON crawler.articles (id); CREATE INDEX articles_url_idx ON crawler.articles (url); Наша система очень медленная. Что ты предлагаешь? – peter

+1

ПЕРВИЧНЫЙ КЛЮЧ (source, created_at, id) и PRIMARY KEY ((source), created_at, id) строго эквивалентны. Дополнительные парсеры вокруг источника - это подчеркнуть тот факт, что источник - это ключ раздела, не беспокойтесь. – doanduyhai

1

Учитывая знание от previous question you posted, где я сказал, индекс замедляя запроса вам нужно решить две вещи:

  1. Написать статью только если он уже не существует
  2. Query статьи, основанной на источник и диапазон запросе на созданной в

основываясь на этих два я бы с двумя таблицами:

Обратный индекс таблицы

CREATE TABLE article_by_id (
    id text, 
    source text, 
    created_at timestamp, 
    PRIMARY KEY (id)) WITH comment = 'Article by id.'; 

Эта таблица будет использоваться для вставки статьи, когда они впервые приходят. Основываясь на возврате после INSERT ... IF NOT EXISTS, вы узнаете, существует ли статья или нет, и если она новая, вы будете писать во вторую таблицу. Также эта таблица может служить для поиска всех ключевых частей для второй таблицы на основе идентификатора статьи. Если вам нужны полные данные о статье, вы можете добавить в эту таблицу также все поля (категория, канал и т. Д.). Это будет тощий ряд, содержащий только одну статью в одном разделе.

Пример вставки:

INSERT INTO article_by_id(id, source, created_at) VALUES (%s,%s, %s) IF NOT EXISTS; 

драйвер возвращает Java, истинным или ложным, был ли применен этот запрос или нет. Вероятно, он такой же в драйвере python, но я его не использовал.

Таблица для запросов по диапазону и запросов по источникам

Как doanduyhai предложил создать вторую таблицу:

CREATE TABLE articles (
    id text, 
    source text, 
    created_at timestamp, 
    category text, 
    channel text, 
    last_crawled timestamp, 
    text text, 
    thumbnail text, 
    title text, 
    url text, 
    PRIMARY KEY ((source),created_at, id) 
) 

В этой таблице вы будете писать только тогда, когда первый ВСТАВИТЬ возвращается истинный смысл у вас есть новый статья, не существующая. Эта таблица будет обслуживать запросы и запросы диапазона по источникам.

рационализаторское предложение

Используя timeuuid вместо timestamp для created_at вы уверены, что не две статьи не может иметь такой же created_at и вы можете потерять id все вместе и полагаться на timeuuid. Однако из второго вопроса я вижу, что вы полагаетесь на внешний идентификатор, поэтому хотели бы упомянуть об этом как о побочном эффекте.

+0

Действительно полезный ответ спасибо. – peter

Смежные вопросы