Если вы, честно говоря, просто хотите узнать, существует ли пользователь:
Самый быстрый подход - это запрос на существование:
select
NOT EXISTS (select username from a where username = {$username}) AND
NOT EXISTS (select username from b where username = {$username}) AND
NOT EXISTS (select username from c where username = {$username});
Если ваш username
столбец помечен как Unique
в каждой таблице, это должен быть самый эффективный запрос, который вы сможете выполнить для выполнения этой операции, и этот превзойдет нормированную таблицу имен пользователей с точки зрения использования памяти ину, фактически, любой другой запрос, который заботится о username
и другом столбце, поскольку нет чрезмерных объединений.Если вас когда-либо призывали ускорить работу базы данных организации, могу вас заверить, что чрезмерная нормализация - это кошмар.В отношении совета, который вы получили по нормализации в этой теме, будьте осторожны.Это отлично подходит для ограничения пространства или ограничения количества мест, в которых вы должны обновлять данные, но вы должны взвесить это в сравнении с затратами на обслуживание и скорость.Примите совет, данный вам на этой странице, с недоверием.
Привыкайте запускать анализатор запросов по вашим запросам, если только по какой-либо другой причине, кроме как привыкнуть изучать последствия выбора, когданаписание запросов - по крайней мере, пока вы не получите свои морские ноги.
Если вы хотите добавить пользователя позже:
Если вы делаете это с целью в конечном итоге добавить пользователя в базу данных, здесь лучшеподход, и это стоит того, чтобы выучить это.Попытайтесь сразу ввести значение.Проверьте позже, чтобы увидеть, если это было успешно.Таким образом, нет места для другого вызова базы данных, чтобы вставить запись между временем, которое вы проверили, и временем, которое вы вставили в базу данных.Например, в MySQL вы можете сделать это:
INSERT INTO {$table} (`username`, ... )
SELECT {$username} as `username`, ... FROM DUAL
WHERE
NOT EXISTS (select username from a where username = {$username}) AND
NOT EXISTS (select username from b where username = {$username}) AND
NOT EXISTS (select username from c where username = {$username});
Все API баз данных, которые я видел, а также все реализации SQL предоставят вам способ узнать, сколько строк было вставлено.Если это 1, то имя пользователя не существует и вставка прошла успешно.В этом случае я не знаю ваш диалект, и поэтому я выбрал MySQL, который предоставляет таблицу DUAL
специально для возврата результатов, которые не привязаны к таблице, но, честно говоря, есть много способов сделать этоcat, независимо от того, помещаете ли вы это в транзакцию или хранимую процедуру, или строго ограничиваете процесс и процедуру, которые могут обращаться к этим таблицам.
Обновление - Как обращаться с пользователями, которые не завершили подписьup process
Как указывает @RedFilter, если регистрация выполняется в несколько этапов - резервирование имени пользователя, заполнение информации, возможно, ответ на подтверждение по электронной почте, тогда вы захотите хотя бы добавить столбецпометить этого пользователя (с отметкой времени, а не с логическим значением), чтобы вы могли периодически удалять пользователей через некоторое время, хотя я рекомендую создать таблицу ToBePurged
и добавить в нее новых пользователей вместе с отметкой времени.Когда подтверждение приходит, вы удаляете пользователя из этой таблицы.Периодически вы будете проверять эту таблицу на наличие всех записей до некоторой разницы с текущим временем и просто удалять их из той таблицы, в которую они были первоначально добавлены.Моя философия заключается в том, чтобы более четко определить ответственность таблицы и сохранить количество записей, с которыми вы работаете, очень скудным.Мы, конечно, не хотим чрезмерно проектировать наши решения, но если вы привыкнете к хорошим архитектурным практикам, эти проекты будут развиваться так же естественно, как и их менее эффективные аналоги.