2016-12-14 3 views
1

У меня есть база данных в производстве, с двумя типами пользователей. Подобно Uber, у нас есть «Rider» и «Driver».Два типа пользователей в базе данных, как я могу переделать мою базу данных?

В моей базе данных у меня есть Пользователи, Rider и Driver tables. Таблица пользователей содержит общие данные между двумя типами пользователей, а таблицы Драйвер и Райдер содержат оставшиеся данные.

Когда база данных изначально была спроектирована, не считалось, что Драйвер может также хотеть быть Всадником. Этот вариант использования, как теперь возник, и я не уверен, как обрабатывать таблицы базы данных.

В настоящее время поле email_address имеет уникальное ограничение. Пользователь также имеет поле user_type, которое является либо Rider, либо Driver.

Мои текущие мысли - удалить уникальное ограничение на email_address и создать уникальный индекс в email_address и user_type, что позволит пользователям использовать обе стороны приложения.

Это создает проблему необходимости указывать, с каким типом пользователя работают, например, при вызове/входе в систему. Думаю, теперь мне нужно будет что-то вроде/login? Type = rider.

Есть ли какие-либо лучшие подходы к этому? Мы в производстве, поэтому я не могу просто ломать и воссоздавать, но я открыт для переноса данных, если есть лучшее решение.

+1

Это звучит как беспорядок. У меня просто была бы одна таблица для всех пользователей, а затем вторая таблица для пользовательских ролей.Каждая запись в этой таблице будет иметь идентификатор пользователя и идентификатор роли. В случае пользователей, которые являются гонщиками и драйверами, в ролях для одного пользователя будет две записи. –

+0

@TimBiegeleisen Спасибо за быстрый ответ. Пользовательские типы также имеют дополнительные поля, например. number_of_trips_taken применяется к «Всадникам», но не «Драйверы». –

+0

Создайте таблицу метаданных всадников, чей внешний ключ является идентификатором пользователя. Если пользователь не присоединился к этой таблице, вы проигнорируете его как не драйвер. –

ответ

0

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

Во время входа в систему вам необходимо определить, хочет ли пользователь войти в систему как водитель или гонщик. Как правило, ссылка для драйверов должна отличаться от ссылки для пользователей. Или должен быть флаг.

Для водителей вам не нужна дополнительная проверка. Но не каждому разрешено войти в систему как драйвер (например, если пользователь по ошибке пытается войти в систему как драйвер, система не должна этого допускать).

Это означает, что ваша начальная таблица пользователей и таблица драйверов не нуждаются в каких-либо изменениях. Теперь, если вы не являетесь драйвером, роль пользователя должна использоваться по умолчанию для всадника. Если вы всадник, входящий в состав гонщика, изменений не требуется. Я предполагаю, что у вас есть механизм установки роли где-то в вашей базе кода.

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

Теперь у вас есть 2 варианта. Во-первых, чтобы получить драйвер, входящий как данные гонщика из таблицы драйверов, а во-вторых, сделать запись в таблице всадника и использовать ее. Оба подхода будут работать (вам нужно будет настроить свою логику приложения на основе флага, чтобы перейти к правильной таблице). Мое предложение - пойти на стол всадника, что должно уменьшить дальнейшие осложнения в системе. Таким образом, в принципе, один пользователь, если он иногда является водителем и иногда гонщиком, должен иметь записи как в таблице драйверов, так и всадника (при условии, что ваше ограничение относится только к пользовательским таблицам), и вы должны использовать правильную запись в зависимости от роли, которую человек регистрирует Надеемся, что после регистрации в правильной таблице изменения в системе будут минимальными.