Идентификатор автоинкремента Mysql или буквенно-цифровой идентификатор в качестве внешнего ключа

у меня есть users таблица с автоинкрементом id а также уникальный буквенно-цифровой pid, Только pid публично обнародован, так как я не хочу, чтобы хакеры играли в систему, запустив for зацикливаться id и извлечение всех данных пользователей.

Вопрос в том, нужно ли мне хранить автоинкремент id на первом месте? Мне нужно выбрать внешний ключ для других пользовательских таблиц, таких как user_details, user_orders и т.д. Должен ли я использовать pid или числовой id как фк?

Некоторые проблемы:

  • присоединяется — Будет присоединяться с помощью id быть более эффективным, чем pid?
  • Индексы — Будет индексация id быть быстрее, чем индексирование pid?
  • операции — Возможны ли транзакции, включающие несколько атомарных вставок, когда pid используется как foreign_key?

1

Решение

В основном, ответы «да», «да» и «да».

Предположительно, буквенно-цифровой ключ будет состоять из нескольких байтов, а целое число будет всего 4 байта (или 8 для bigint). Значения внешнего ключа хранятся в любом индексе, где они определены, поэтому короткие значения хороши. Также хорошо иметь ключ одинаковой длины.

Вы не упоминаете, где ваш pid придет из. Например, UUID (который является просто битовой строкой) составляет 16 байтов против 4 байтов для строки. Это заняло бы больше места в любых индексах, хотя это можно было бы использовать.

Что еще более важно, ваша проблема здесь — безопасность. Я думаю, что наличие одного идентификатора для пользователей, а другого внутри базы данных обеспечивает дополнительный уровень безопасности. Например, вы можете иметь высокий уровень безопасности при преобразовании из PID в ID (зашифрованный, зарегистрированный, безопасный интерфейс).

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]