2009-06-17 16 views
13

Chcę przechowywać duży zestaw adresów URL w MySql i utworzyć unikalny indeks w kolumnie. Jeśli utworzę kolumnę utf8, będę ograniczony do varcharu (333), który nie wystarczy do przechowywania niektórych moich adresów URL. Jeśli zadeklaruję kolumnę jako latin1, otrzymam pełne 1000 znaków (nie sądzę, że potrzebuję tak dużo). Muszę jednak zakodować adres URL i mieć pewność, że zawsze pracuje z zakodowanym adresem URL. Czy istnieje lepszy sposób na zarządzanie dużymi zestawami adresów URL?Najbardziej skuteczny sposób przechowywania adresów URL w Mysql?

Odpowiedz

5

Jedną z rzeczy, o których możesz pomyśleć, jest przechowywanie nazwy hosta i części protokołu adresu URL w oddzielnej tabeli i odnoszenie go za pomocą klucza. Może to również później okazać się przydatne przy uzyskiwaniu wszystkich adresów URL dla określonego hosta, a także w rozwiązywaniu problemów związanych z długością łańcucha.

Na przykład:

PROTOCOLS 
----------------------- 
PROTOCOL_ID INTEGER 
PROTOCOL  VARCHAR(10) (i.e., http, https, ftp, etc.) 

HOSTS 
----------------------- 
id  BIGINT 
hostname varchar(256) 

URL 
----------------------- 
PROTOCOL  INTEGER FK to PROTOCOLS 
HOSTNAME  BIGINT FK to HOSTS 
QUERY_STRING VARCHAR(333) 
+0

Niektóre ciągi zapytań mogą być długie: http: //www.foo.com/index.jsp? A = 1 & b = 2 & c = 3 ..................... .......................... & z = uuuuggggghhhh –

+0

Uzgodnione. Możesz chcieć pójść drogą sugestii longneck'a o użyciu pola tekstowego. Bardziej przychodzi mi do głowy "Czy istnieje lepszy sposób na zarządzanie dużymi zestawami URL-i", co wpływa również na długość adresów URL.Jedną z rzeczy, którą możesz chcieć zrobić, w zależności od tego, w jaki sposób twoje adresy URL dzielą nazwę hosta na hosta i domenę, a tabela HOSTS ma klucz domeny z powrotem do tabeli DOMAIN. Może to sprawić, że znalezienie wszystkich adresów URL w domenie będzie banalne. –

+0

Adresy URL mogą być bardzo długie - http://www.boutell.com/newfaq/misc/urllength.html – cjroth

0

Najczęściej stosowaną praktyką jest używanie algorytmu mieszania z kontrolą kolizji, wystarczy użyć pewnego rodzaju szybkiego kodowania jednokierunkowego, które spowoduje bardzo małe kolizje w adresach URL.

Spróbuj odciąć części, o których wiesz, że będą takie same dla wszystkich adresów URL (tj. HTTP: //, www, itd.) JEŚLI adresy URL są częścią Twojej domeny, odetnij to również.

W przeciwnym razie ponownie przeanalizuję problem i spróbuję znaleźć inny sposób osiągnięcia tego, co chce się osiągnąć. Zakładam, że posiadanie unikalnego zestawu adresów URL naprawdę rozwiązuje jakiś inny problem.

+2

Tworzysz prawdopodobnie błędne założenia o tym, dlaczego przechowuje adresy URL. Prawdopodobnie/nie/bezpiecznie jest odciąć www, itp. –

+0

Czy możesz podać przykład? Po usunięciu http i www możesz łatwo odtworzyć pierwotny URL, nie wpływa to na integralność definicji ... Czy możesz to wyjaśnić? –

+5

To źle. Nie ma gwarancji, że http://www.foo.com i http://foo.com odnoszą się do tego samego adresu URL. Nie mówiąc już o https://www.foo.com i http://foo.com. –

9

trzy dobre sposoby, aby to zrobić:

1) stosowanie tekstu zamiast VARCHAR. aby zapewnić wyjątkowość, musisz również utworzyć oddzielną kolumnę VARCHAR, aby przechowywać skrót MD5() lub SHA1() i dodać indeks UNIQUE lub PRIMARY. ma to niefortunną konsekwencję, że dodatkowy dysk próbuje odzyskać URL, ale w zależności od twojego przypadku użycia, który może być OK.

2) użyj VARCHAR z układaniem binarnym i skompresuj URL za pomocą COMPRESS().

3) Zapomniałem trzeciego, gdy pisałem pierwsze dwa. grr ...

+1

+1, osobiście wybrałabym numer 1 (umieszczając unikalne ograniczenie na haśle adresu URL, a nie na URL samo). – nathan

+0

Czy powinienem utworzyć kolejną kolumnę dla skrótu, zamiast ustawić kolumnę URL VARCHAR jako podstawową? – User

+0

Zrobiłem dwie oddzielne sugestie. Nie powiedziałem, że jeden był lepszy od drugiego. Musisz wybrać, który jest najbardziej odpowiedni dla twojego przypadku użycia. – longneck

Powiązane problemy