Откуда берутся совпадения
Одинаковые названия встречаются постоянно: товары одной модели в разных цветах, статьи с типовыми заголовками, карточки в разных разделах. Если генератор просто транслитерирует название, вторая запись получит тот же слаг, и при уникальном индексе сохранение завершится ошибкой.
Стратегии разрешения совпадений
- добавить числовой суффикс:
divan-alfa,divan-alfa-2; - добавить осмысленное уточнение: цвет, категорию, год;
- добавить короткий уникальный код записи.
Осмысленное уточнение лучше числа: адрес остаётся информативным, а различие понятно пользователю.
Пример алгоритма подбора свободного значения
function uniqueSlug(base) {
let slug = base, n = 2;
while (exists(slug)) {
slug = base + '-' + n;
n++;
}
return slug;
}
Алгоритм проверяет занятость и увеличивает суффикс, пока не найдёт свободное значение.
Защита от одновременных запросов
Между проверкой занятости и сохранением записи может пройти время, и за него другой запрос успеет занять тот же слаг. Поэтому окончательную защиту всегда обеспечивает уникальный индекс, а при ошибке нарушения уникальности генерацию повторяют.
Принцип: проверка в коде — для удобства и красивых сообщений, уникальный индекс — для надёжности.
Не меняйте уже опубликованные слаги
Если для новой записи нужный слаг занят, уточнять нужно новую запись, а не переименовывать существующую. Изменение адреса опубликованной страницы потребует редиректа, как разбирается в статье про цепочки перенаправлений.
Коллизии при массовом импорте
Самая тяжёлая ситуация — загрузка тысяч записей из файла, среди которых много одинаковых названий. Простая проверка «занято ли значение» по одной записи за раз работает медленно. Эффективнее заранее загрузить список существующих слагов в память и подбирать свободные значения там, а затем сохранять записи пакетом.
- загрузите существующие слаги в набор;
- для каждой записи подберите свободное значение и добавьте его в набор;
- сохраните пакет и обработайте возможные ошибки уникальности.
Читаемость итогового адреса
Числовые суффиксы допустимы, но большое число в конце вроде divan-alfa-847 говорит о плохо спроектированной генерации. Если однотипных записей много, подумайте о включении в слаг дополнительных характеристик, отличающих товары друг от друга, — цвета, размера, артикула.
Частые вопросы
Что лучше — числовой суффикс или уточняющее слово?
Осмысленное уточнение предпочтительнее: адрес остаётся понятным, а различие между записями очевидно и пользователю, и поисковой системе.
Как избежать совпадений при одновременном создании записей?
Опираться на уникальный индекс в базе данных и при ошибке нарушения уникальности повторять генерацию слага.
Можно ли переименовать старую запись, чтобы освободить слаг?
Не стоит: изменение адреса опубликованной страницы требует редиректа и создаёт риск потери трафика.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.