2017-02-15 21 views
0

Я пытаюсь найти лучшую модель данных для адаптации очень большой таблицы mysql в Кассандре. Эта таблица построена так:Cassandra, как фильтровать и обновлять большой стол динамически?

CREATE TABLE big_table (
    social_id, 
    remote_id, 
    timestamp, 
    visibility, 
    type, 
    title, 
    description, 
    other_field, 
    other_field, 
    ... 
) 

страница (не здесь) может содержать много, что общественные мероприятия могут содержать много remote_ids.

Social_id - это ключ разделения, remote_id и timestamp - это ключ кластеризации: «Remote_id» дает однозначность, «Время» используется для заказа результатов. Все идет нормально.

Проблема заключается в том, что пользователи могут также искать содержимое своей страницы, фильтруя одну или несколько социальных сетей, один или несколько типов, видимость (может быть 0,1,2), диапазон дат или даже ничего. Кроме того, на основе фильтров пользователи должны иметь возможность устанавливать видимость.

Я попытался справиться с этим делом, но я действительно могу найти устойчивое решение. Лучшее, что у меня есть, это создать еще один стол, который мне нужно не отставать от оригинального. Эта таблица будет иметь:

  • page_id: раздел ключа
  • метку времени, social_id, тип, remote_id: кластеризация ключ

Plus, создать материализованное представление для каждой комбинации фильтров, что безумие ,

Могу ли я избежать создания второй таблицы? Что в этом случае будет лучшей моделью Кассандры? Должен ли я переходить на другие технологии?

ответ

0

Я начинаю с последних вопросов.

> Какая была бы лучшая модель Кассандры в этом случае?

Как указано в Cassandra: The Definitive Guide, 2nd edition (который я настоятельно рекомендую прочитать перед выбором или с использованием Cassandra),

В Кассандре не начать с моделью данных; вы начинаете с запроса модели.

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

Таким образом, ответ на

> Могу ли я избежать создания второй таблицы?

is Вы не должны избегать этого.

> Должен ли я переходить на другие технологии?

Это зависит от того, что вам нужно с точки зрения репликации и разбиения. Вы можете создать синхронизацию master-master на основе СУБД или что-то еще.В Cassandra вы получите дублированные данные между таблицами, и это совершенно нормально для него. Вы торгуете дисковым пространством в обмен на скорость чтения/записи.

> как динамически фильтровать и обновлять большую таблицу?

Если после того, как все вышеперечисленное вы все еще хотите использовать нормированную модель данных Cassandra, я предлагаю вам взглянуть на secondary indexes на первом, а затем перейдете к настраиваемым индексам как Lucene index.

+0

Хорошо для репликации контента, но как бы вы моделировали таблицу с проблемой, о которой я говорил (несколько динамических фильтров)? Создаете ли вы таблицу для каждой комбинации фильтров? Или таблица плюс много материализованных представлений? Какая лучшая модель обрабатывает этот случай? –

+0

Пример из Кассандры: книга TDG предлагает вам заранее определить запросы, которые будут использовать ваши пользователи (например, из книги: поиск 'hotel' по' name' или 'free_rooms count') и создание таблиц для каждого запроса. Независимо от того, какие запросы не были предварительно определены, вам потребуется либо «SELECT *;», либо работать с ним на стороне приложения, либо использовать вторичные индексы. – doz10us

+0

Однако вторичный индекс не рекомендуется для столбцов с уникальными значениями (индекс будет равен столбцу) и для столбцов с несколькими разными значениями (например, столбец «gender»). – doz10us