Хранение предметов на карте или в строках в Кассандре
Мне нужно хранить списки пользователей по клиенту в Кассандре. Я вижу два основных подхода:
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 ответ
Я бы придерживался А, определенно.
Коллекции могут содержать не более 64 тыс. Запрашиваемых элементов, так что это ваш жесткий лимит. И C* читает всю коллекцию во время запросов, поэтому вы хотите, чтобы коллекции были максимально пустыми, чтобы избежать огромных штрафов за чтение.
Я ожидаю, что производительность будет одного порядка, потому что оба являются последовательными чтениями.
В B вы будете использовать не идемпотентные запросы для обновления коллекции.Моя ошибка, это карта, а не список.А очень легко обновляет вашу схему. В B вам нужно читать, изменять, писать свои записи.
Палка с А.