Генерация случайной строки в приложении и проверка ее уникальности - неплохое решение. Не беспокойтесь о том, что это неэффективно, это не так - и определенно не по сравнению с альтернативами. Это, безусловно, будет быстрее, чем запуск db.user.count()
или ведение отдельной таблицы с предварительно рассчитанными идентификаторами. Вам просто нужно сделать это правильно.
Прежде всего, как часто будут создаваться новые пользователи? Вероятно, не очень часто по сравнению с другими вещами, так что на самом деле все обсуждение эффективности является спорным. Во-вторых, с 7 символами A-Z, 0-9, это диапазон 36 ^ 7 или где-то около 78 миллиардов. Пройдет некоторое время, прежде чем вы начнете видеть столкновения, если не сказать больше.
Если вы просто сделаете это так, это не повлечет за собой снижения производительности, если не произойдет столкновение (что крайне маловероятно):
- Создать уникальный идентификатор пользователя
- Вставьте ваш пользовательский объект, используя идентификатор пользователя в качестве значения
_id
- Проверка на наличие дублирующихся ошибок ключа (как это сделать, зависит от языка и драйвера, но может включать выполнение команды
getLastError
).
- При повторяющейся ошибке ключа начните заново, сгенерировав новый идентификатор пользователя
Таким образом, в случае столкновения будет только дополнительная работа (и я действительно, очень хочу подчеркнуть, как невероятно маловероятно это будет).
Существует еще один способ создания уникального идентификатора пользователя: взять текущую метку времени UNIX (с точностью до секунды), добавить хэш имени хоста, затем идентификатор процесса и, наконец, текущее значение счетчика. Фактически именно так генерируется ObjectId
Монго и гарантирует, что вы можете генерировать столько объектов в секунду на процесс, сколько и максимальное значение вашего счетчика (которое в Монго составляет 3 байта, то есть 16 миллионов). Посмотрите документы по ObjectId, если вам интересны подробности: http://www.mongodb.org/display/DOCS/Object+IDs
Он обладает свойством, которое идентифицирует ваши идентификаторы пользователей в порядке их создания, но его длина составляет 12 байтов, поэтому, к сожалению, немного длиннее, чем ваши 7 символов. Вы можете использовать тот же метод и пропустить имя хоста / pid и сократить счетчик (который также может быть случайным числом) до двух байтов, тогда вы будете уменьшены до 6 байтов, которые, вероятно, могут быть сжаты примерно до 9 символы AZ, 0-9.