Безопасно ли использовать mysql с автоинкрементом в качестве идентификатора пользователя? - PullRequest
10 голосов
/ 10 ноября 2011

Я работаю над сайтом, который позволяет людям создавать профили онлайн. Мне было интересно, если это правильный выбор, чтобы использовать идентификаторы MySQL AUTO_INCREMENT ed в качестве моих идентификаторов пользователя. Также с учетом того, что мне может понадобиться дублировать базу данных на нескольких серверах за один день?

например. Вы бы использовали этот метод для идентификаторов пользователей на таких сайтах, как Twitter или Facebook?


Я пытался генерировать идентификаторы пользователей с помощью PHP раньше. Я использовал что-то вроде этого:

function generateID() {
      $possible = "1234567890";
      $code = "";
      $characters = mt_rand(7,14);
      $i = 0;
      while ($i < $characters) { 
            $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
            $i++;
      }
      return $code;
}

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

Разве нет лучшего подхода?

Ответы [ 5 ]

15 голосов
/ 10 ноября 2011

Безопасно ли использовать mysql с автоматическим приращением в качестве идентификатора пользователя?

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

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

4 голосов
/ 10 ноября 2011

Нет, это не очень хорошая идея, потому что идентификаторы auto_increment не легко переносимы.Для ваших пользовательских идентификаторов вы хотите идентификаторы, которые можно создавать резервные копии, восстанавливать, перемещать между экземплярами базы данных и т. Д., Не беспокоясь о конфликте идентификаторов.

Было бы лучше создать уникальный номер или буквенно-цифровую строку, используячто-то вроде UUID.

2 голосов
/ 10 ноября 2011

Учитывая, что вы планируете заранее и, возможно, будете распределять данные по базам данных, вам лучше рассмотреть возможность использования функции UUID () для получения уникальных идентификаторов. Это значительно упрощает объединение данных в будущем.

0 голосов
/ 10 ноября 2011

Да Если вы удалите строку, скажем, с идентификатором 7, следующее значение автоматического приращения будет 8, а не 7 снова.Так что все значения обязательно будут уникальными.и вам нужно будет обрезать таблицу, чтобы снова запустить автоинкремент.Поэтому вы всегда можете использовать поля автоинкремента для ID пользователя.

0 голосов
/ 10 ноября 2011

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

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

Я не могу сказать, является ли это лучшей практикой или нет, но это, безусловно, работает.

...