у меня есть users
таблица с автоинкрементом id
а также уникальный буквенно-цифровой pid
, Только pid
публично обнародован, так как я не хочу, чтобы хакеры играли в систему, запустив for
зацикливаться id
и извлечение всех данных пользователей.
Вопрос в том, нужно ли мне хранить автоинкремент id
на первом месте? Мне нужно выбрать внешний ключ для других пользовательских таблиц, таких как user_details
, user_orders
и т.д. Должен ли я использовать pid
или числовой id
как фк?
Некоторые проблемы:
id
быть более эффективным, чем pid
?id
быть быстрее, чем индексирование pid
?pid
используется как foreign_key
?В основном, ответы «да», «да» и «да».
Предположительно, буквенно-цифровой ключ будет состоять из нескольких байтов, а целое число будет всего 4 байта (или 8 для bigint). Значения внешнего ключа хранятся в любом индексе, где они определены, поэтому короткие значения хороши. Также хорошо иметь ключ одинаковой длины.
Вы не упоминаете, где ваш pid
придет из. Например, UUID (который является просто битовой строкой) составляет 16 байтов против 4 байтов для строки. Это заняло бы больше места в любых индексах, хотя это можно было бы использовать.
Что еще более важно, ваша проблема здесь — безопасность. Я думаю, что наличие одного идентификатора для пользователей, а другого внутри базы данных обеспечивает дополнительный уровень безопасности. Например, вы можете иметь высокий уровень безопасности при преобразовании из PID в ID (зашифрованный, зарегистрированный, безопасный интерфейс).
PID никогда не будет в реальных данных, поэтому получение полных копий многих таблиц может все еще не идентифицировать пользователей, если вы будете следовать рекомендациям по содержанию таблиц.
Других решений пока нет …