Вам понадобится числовой первичный ключ с автоинкрементом. В тех случаях, когда вам нужно передавать идентификаторы или объединяться с другими таблицами (например, необязательные атрибуты для URL-адреса), вам понадобится что-то маленькое и числовое.
Что касается того, какие еще столбцы и индексы вам нужны, это, как всегда, зависит от того, как вы собираетесь их использовать.
Столбец, в котором хранится хэш каждого URL-адреса, является отличной идеей практически для любого приложения, использующего значительное количество URL-адресов. Это делает ВЫБОР URL-адреса по его полному тексту настолько быстрым, насколько это возможно. Второе преимущество заключается в том, что если вы сделаете этот столбец УНИКАЛЬНЫМ, вам не нужно беспокоиться о том, чтобы сделать столбец, в котором хранится фактический URL-адрес, уникальным, и вы можете использовать REPLACE INTO и INSERT IGNORE как простые и быстрые операции атомарной записи.
Я бы добавил, что для этой цели прекрасно подходит встроенная в MySQL функция MD5 (). Его единственный недостаток в том, что специализированный злоумышленник может вызвать коллизии, которые, я уверен, вам наплевать. Использование встроенной функции значительно упрощает, например, некоторые типы соединений. Передача полного URL-адреса по сети может быть немного медленнее («ВЫБРАТЬ URL-адрес ИЗ URL-адресов WHERE hash = MD5 ('verylongurl')» вместо «WHERE hash = '32charhexstring'»), но у вас будет возможность сделать это, если хочешь. Если вы не можете придумать конкретный сценарий, в котором MD5 () вас подведет, не стесняйтесь его использовать.
Трудный вопрос заключается в том, нужно ли и как вам искать URL-адреса способами, отличными от их полного текста: например, хотите ли вы найти все URL-адреса, начинающиеся с «/ foo», на любом хосте «bar.com»? Хотя «LIKE '% bar.com% / foo%'» будет работать при тестировании, он потерпит неудачу при масштабировании. Если ваши потребности включают такие вещи, вы можете придумать творческие способы создания индексов, отличных от UNIQUE, нацеленных на нужный вам тип данных ... может быть, столбец domain_name для начала. Вам почти наверняка придется заполнять эти столбцы из вашего приложения (триггеры и хранимые процедуры - намного больше проблем, чем они того стоят, особенно если вас беспокоит производительность - не беспокойтесь).
Хорошая новость в том, что реляционные базы данных очень гибки для такого рода вещей. Вы всегда можете добавить новые столбцы и заполнить их позже. Я бы посоветовал для начала: int unsigned auto_increment первичный ключ, уникальный хэш-символ (32) и (при условии, что символов 64К достаточно) текстовый URL.
person
Jamie McCarthy
schedule
17.09.2010