Создать URL
Генератор Правила транслитерации Как сделать ЧПУ Блог Вопросы и ответы Создать URL
Разработка

Генерация уникального слага при коллизиях

Логичное продолжение темы хранения слага — что делать, когда нужное значение уже занято другой записью.

Откуда берутся совпадения

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

Стратегии разрешения совпадений

  1. добавить числовой суффикс: divan-alfa, divan-alfa-2;
  2. добавить осмысленное уточнение: цвет, категорию, год;
  3. добавить короткий уникальный код записи.

Осмысленное уточнение лучше числа: адрес остаётся информативным, а различие понятно пользователю.

Пример алгоритма подбора свободного значения

function uniqueSlug(base) {
  let slug = base, n = 2;
  while (exists(slug)) {
    slug = base + '-' + n;
    n++;
  }
  return slug;
}

Алгоритм проверяет занятость и увеличивает суффикс, пока не найдёт свободное значение.

Защита от одновременных запросов

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

Принцип: проверка в коде — для удобства и красивых сообщений, уникальный индекс — для надёжности.

Не меняйте уже опубликованные слаги

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

Коллизии при массовом импорте

Самая тяжёлая ситуация — загрузка тысяч записей из файла, среди которых много одинаковых названий. Простая проверка «занято ли значение» по одной записи за раз работает медленно. Эффективнее заранее загрузить список существующих слагов в память и подбирать свободные значения там, а затем сохранять записи пакетом.

  1. загрузите существующие слаги в набор;
  2. для каждой записи подберите свободное значение и добавьте его в набор;
  3. сохраните пакет и обработайте возможные ошибки уникальности.

Читаемость итогового адреса

Числовые суффиксы допустимы, но большое число в конце вроде divan-alfa-847 говорит о плохо спроектированной генерации. Если однотипных записей много, подумайте о включении в слаг дополнительных характеристик, отличающих товары друг от друга, — цвета, размера, артикула.

Частые вопросы

Что лучше — числовой суффикс или уточняющее слово?

Осмысленное уточнение предпочтительнее: адрес остаётся понятным, а различие между записями очевидно и пользователю, и поисковой системе.

Как избежать совпадений при одновременном создании записей?

Опираться на уникальный индекс в базе данных и при ошибке нарушения уникальности повторять генерацию слага.

Можно ли переименовать старую запись, чтобы освободить слаг?

Не стоит: изменение адреса опубликованной страницы требует редиректа и создаёт риск потери трафика.

Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.

Читайте также