Структурирование таблиц Cassandra для высокоскоростных запросов

#cassandra

#cassandra

Вопрос:

Мы рассматриваем возможность использования Cassandra для хранения данных для клинического испытания. Данные — это, по сути, насыщение кислородом и частота дыхания (и несколько других параметров). Нам также необходимо сохранить идентификатор пациента, код посещения и код учреждения. Мы ожидаем, что потребуется извлекать данные только по уникальному пациенту / посещению. Однако у каждого пациента может быть более 500 000 записей. Там может быть 1000 пациентов и, возможно, 100 учреждений. Мой вопрос касается дизайна таблицы (таблиц) для обеспечения быстрого извлечения данных:

 Create table Oxy&enSats
    (
        facility int,
        visit text,
        pat_id text,
        probe_id text
        event timestamp,
        oxy&en float,
        resp int,
        Primary key((facility, visit), pat_id)
    );
  

Исходя из этого, я думаю, что данные будут кластеризованы по pat_id и разделены по (facility, visit). Правильно ли это? Скорость чтения очень важна. Нам нужно будет выбрать по пациенту (в основном, учреждение, визит, пациент) и отфильтровать по дате.

Является ли это оптимальным подходом для типа данных, с которыми мы имеем дело? Приветствуются любые рекомендации.

Необходимые нам запросы достаточно просты — нам просто нужно выбрать все данные для пациента (фильтрация по дате также была бы полезна):

 select oxy&en, resp from Oxy&enSats where facility = '1', and visit = '1' and pat_id = '22'
  

Комментарии:

1. Было бы полезно, если бы вы могли написать запросы CQL, которые вы хотите выполнить в вопросе.

Ответ №1:

Вы правы в своем предположении, что он разбит на разделы по составному ключу (facility, visit) и кластеризован по pat_id. Уникальность посещения здесь критична, но не указана, прямо сейчас мы не можем сказать, является ли посещение уникальным для каждого посещения пациента в глобальном масштабе или нет. Также было бы полезно получить более подробную информацию о запросах select, будут ли они включать диапазоны или просто точечные запросы?

Единственное, что вы можете сделать, это протестировать его с помощью репозитория NoSQLBench на Github и документов — это даст вам хорошее представление о производительности перед использованием.

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

Комментарии:

1. Спасибо за ваши комментарии. Комбинация facility, visit, patient_id была бы глобально уникальной, но имела бы отношение «один ко многим» с данными oxy&en. Visit будет иметь отношение «многие к одному» с patient_id — у пациента может быть несколько посещений. По приблизительным подсчетам, объем данных за 1 месяц при 5-секундных выборках составляет около 8 МБ, поэтому ограничение по размеру должно быть в порядке. Благодарим вас за предложение по бенчмаркингу

2. Итак, ваш первичный ключ сам по себе не является первичным для одного пациента, посещающего учреждение — у них есть несколько показаний — ваш PK в настоящее время не создает первичность для этой записи чтения — вам нужно убедиться, что PK действительно является PK.

3. конечно… итак, мне нужно определить еще один уникальный ключ для каждой строки

4. Да, расширьте столбцы кластеризации, чтобы убедиться, что они уникальны.

5. Я думаю, UUID подойдет для этой цели?