Вие ще искате автоинкрементен цифров първичен ключ. За моментите, когато трябва да предавате идентификатори или да се съединявате с други таблици (например незадължителни атрибути за URL), ще искате нещо малко и числово.
Колкото до това какви други колони и индекси искате, зависи, както винаги, от това как ще ги използвате.
Колона, съхраняваща хеш на всеки URL адрес, е отлична идея за почти всяко приложение, което използва значителен брой URL адреси. Това прави ИЗБИРАНЕТО на URL адрес по пълния му текст толкова бързо, колкото може да стане. Второ предимство е, че ако направите тази колона УНИКАЛНА, не е нужно да се притеснявате да направите колоната, съхраняваща действителния URL адрес, уникална и можете да използвате REPLACE INTO и INSERT IGNORE като прости, бързи атомарни операции за запис.
Бих добавил, че използването на вградената функция MD5() на MySQL е чудесно за тази цел. Единственият му недостатък е, че специализиран нападател може да предизвика сблъсъци, което съм напълно сигурен, че не ви интересува. Използването на вградената функция прави, например, някои видове обединения много по-лесни. Може да бъде малко по-бавно предаването на пълен URL адрес през кабела („SELECT url FROM urls WHERE hash=MD5('verylongurl')“ вместо „WHERE hash='32charhexstring'“), но ще имате опцията да направиш това, ако искаш. Освен ако не можете да измислите конкретен сценарий, при който MD5() ще ви разочарова, можете да го използвате.
Трудният въпрос е дали и как ще трябва да търсите URL адреси по начини, различни от пълния им текст: например, ще искате ли да намерите всички URL адреси, започващи с "/foo" на който и да е хост "bar.com"? Докато „КАТО '%bar.com%/foo%'“ ще работи при тестване, ще се провали мизерно в мащаб. Ако вашите нужди включват такива неща, можете да измислите творчески начини за генериране на не-УНИКАЛНИ индекси, насочени към типа данни, от които се нуждаете... може би колона име на домейн, за начало. Почти сигурно ще трябва да попълните тези колони от вашето приложение (тригерите и съхранените процедури създават много повече проблеми, отколкото си заслужават тук, особено ако сте загрижени за производителността - не си правете труда).
Добрата новина е, че релационните бази данни са много гъвкави за такива неща. Винаги можете да добавяте нови колони и да ги попълвате по-късно. Бих предложил за начало: int unsigned auto_increment първичен ключ, уникален хеш char(32) и (ако приемем, че са достатъчни 64K знака) текстов url.
person
Jamie McCarthy
schedule
17.09.2010