Мы моделируем таблицу учетных записей в cassandra с социальными логинами, мы выбрали электронную почту в качестве первичного ключа и реализацию узкой строки. Наша кассандра стоит на версии 2.1.6
. Вот определение таблицы:
CREATE TABLE account_by_email (
email_address text,
account_password text,
first_name text,
last_name text,
registered_at timestamp,
roles set<text>,
facebook_id text,
twitter_id text,
linkedin_id text,
password_reset_token blob,
password_reset_token_valid_until timestamp,
profile_image_url text,
PRIMARY KEY (email_address) ) WITH COMMENT='Accounts in system by email.';
Это прекрасно работает для доступа к электронной почте, поскольку мы можем быстро получить доступ к каждой учетной записи, когда мы знаем адрес электронной почты, который возникает после входа в систему.
Пользователь имеет, помимо возможности входа по электронной почте, возможность входа / регистрации с учетными записями в социальных сетях. Когда используется вход в социальную учетную запись, поток переходит в социальную сеть, получает социальный идентификатор (facebook, twitter, linkedin) и, возможно, электронную почту и запрашивает таблицу учетной записи по социальному идентификатору, чтобы получить полную учетную запись или просто электронную почту и продолжать использовать электронную почту для каждого запроса API.
В настоящее время мы добавили индексы на facebook_id
, twitter_id
, linkedin_id
, чтобы поддержать это, поскольку мы находимся в фазе MVP с одним узлом, и мы предпочли реализацию жира производительности.
Каков правильный способ смоделировать это? Вот пара предложений, о которых мы думаем:
- оставить реализацию индекса, поскольку выборка по социальному идентификатору происходит только при входе в систему один раз (после этого используется электронная почта)
- иметь одну таблицу для каждого социального идентификатора, которая будет содержать пару адресов электронной почты социального идентификатора
- иметь одну таблицу для каждого социального идентификатора, который будет содержать полную учетную запись (учетная запись может быть отредактирована, поэтому это усложнит обновление)
- что-то другое?
И еще вопрос, действительно ли реализация индекса с полем высокой кардинальности (в качестве социального идентификатора) настолько плоха, когда вы моделируете путь доступа, который случается редко?