Обычно так и делают. Это классическое решение, которое применяется практически везде. Используют слаг или id.
Что-то вроде
SELECT ... FROM ... WHERE `id`='event-name' OR `slug`='event-name'
В таком варианте будет работать id и слаг, так что не прийдется ничем жертвовать.
Не забудьте заэскейпить данные перед передачей в запрос.
Есть альтернативный вариант, когда хранится внутренняя таблица соответствий url1 -> url2. Это вариант менее удобен с точки зрения разработчика, т.к приходится прилагать много усилий по поддержанию актуальности и т.д. Такой вариант имеет плюс при правильной реализации - можно хранить цепочку редиректов со старого адреса на новый. Например, если у вас страница 3 раза получала новый адрес, то в этой таблице будет 4 варианта редиректов. Один актуальный и 3 устаревших. При этом при переходе по старому адресу будет происходить редирект на новый. Поддержание такого реестра ссылок дело не очень удобное, но подойдет для приложений уровня крупных компаний, которые не могут себе позволить отправить клиента на пустую страницу.