Я не согласен, что целочисленный ключ ВСЕГДА лучше. Конечно, быстрее искать по целому числу. Но если на самом деле доступ, который вы должны сделать, всегда будет или почти всегда будет текстовым значением, то тот факт, что если бы у вас был идентификатор записи для поиска, это было бы намного быстрее, в значительной степени не имеет значения. Если вы заранее знали номер выигрышной лотереи, вы могли бы купить билет с этим номером и стать богатым. Бесспорно верное утверждение, но не полезно, если вы не случится иметь выигрышный лотерейный номер заранее.
Таким образом, реальный вопрос заключается в следующем: что вам нужно хранить в ВАШЕЙ базе данных и как ВЫ должны получить к ней доступ? Если 99% ваших обращений будут «брать URL-адрес и искать запись», то использование URL-адреса или чего-то, что вы извлекаете из URL, возможно, является хорошей идеей.
Мой главный аргумент против этого не в том, что это строка, а в том, что она объединяет множество различных фактов. Вы когда-нибудь заботились о частях? Мол, ты когда-нибудь хотел сказать: «Найди мне все Форды»? Если это так, то «Форд» застрял в середине первичного ключа - очень и очень плохая идея. Единственный способ найти все Форды - это последовательный поиск по всему файлу с поиском символов «Форд» в середине клавиши. Некрасиво. Намного лучше иметь отдельное поле «make», по которому вы можете искать.
Я не знаю ваше приложение, но подозреваю, что переход от URL к записи - не единственный доступ. Есть ли какая-то функция просмотра или поиска, где пользователь может сказать: «Найди мне все кабриолеты, которым меньше 10 лет» или что-то подобное? Если это так, вам действительно нужно разбить данные на отдельные поля, чтобы иметь возможность поиска.
Кроме того, какие данные вы получаете, когда получаете этот URL? Вы получаете только одну запись и показываете ее, или есть много записей, свисающих с нее? Если есть связанные записи, то, если URL является первичным ключом «начальной» записи, тогда все эти связанные записи также должны будут содержать этот большой URL в качестве внешнего ключа. Это может стать грязным. Вы должны учитывать общую структуру вашей базы данных - какие таблицы вам нужны и как они связаны - прежде чем принимать решение об индексах. (Эй, это звучит как хорошее место для добавления бесстыдного плагина для моей книги «Разумный подход к проектированию баз данных», где я обсуждаю вопросы проектирования и порядок, в котором вы должны принимать проектные решения.)
Деталь, но потенциально большая: вам действительно нужны имена подразделений и их значения? То есть вместо того, чтобы указывать URL-адрес «website.com/Type/Car/Country/Usa/Manufacturer/Ford/Year/2007», не может ли это быть просто «website.com/Car/Usa/Ford/2007»? Это устранит много лишнего текста. И, кстати, если вы имеете дело только с одним веб-сайтом, так что все ваши URL начинаются с «website.com», то вам, конечно, не нужно хранить это в каждой записи. О, а порядок значительный? Может кто-нибудь дать URL «webiste.com/Year/2007/Type/Car/Manufacturer/Ford/Country/Usa» и получить ту же информацию? Если так, все становится намного сложнее.
Есть ли здесь что-то кроме автомобилей? Например, может быть «website.com/Type/Pet/Kind/Dog/Breed/Poodle» или что-то подобное? (Или пропуская метки "/ Pet / Dog / Poodle".) Если это так, общая схема использования URL выглядит немного лучше, чем более конкретная схема, которая пытается разбить его на отдельные поля. Может быть.