Хранение предметов на карте или в строках в Кассандре

Мне нужно хранить списки пользователей по клиенту в Кассандре. Я вижу два основных подхода:

A: create table users (  // one row per user
     customer int, userId int, primary key (customer, userId),
     login text, name text, email text
   );

или же

B: create table users (  // one row per customer
     customer int primary key, users map<int, text>
   );

где при втором подходе я бы сохранял JSON-представление пользовательских данных в виде "текста".

У меня будут следующие операции на столе:

  • вставить / обновить / удалить одного пользователя
  • читать все пользователи для клиента
  • читать одного пользователя по идентификатору и клиенту

Вот вопросы:

1) Для больших списков пользователей B - плохая идея. Какой порядок величины будет "большим"?

2) Ожидаете ли вы, что B будет иметь лучшую производительность для небольших списков пользователей? Какой порядок величины будет "маленьким"?

3) Какие еще преимущества / недостатки вы видите для A или B?

(Для тех, кому нужно знать: я использую scala / datastax driver / phantom для доступа к базе данных.)

1 ответ

Решение

Я бы придерживался А, определенно.

  1. Коллекции могут содержать не более 64 тыс. Запрашиваемых элементов, так что это ваш жесткий лимит. И C* читает всю коллекцию во время запросов, поэтому вы хотите, чтобы коллекции были максимально пустыми, чтобы избежать огромных штрафов за чтение.

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

  3. В B вы будете использовать не идемпотентные запросы для обновления коллекции. Моя ошибка, это карта, а не список.

  4. А очень легко обновляет вашу схему. В B вам нужно читать, изменять, писать свои записи.

Палка с А.

Другие вопросы по тегам