2009-06-17 22 views
13

MySql'de çok sayıda URL'yi saklamak ve sütunda benzersiz bir dizin oluşturmak istiyorum. Eğer utf8 sütununu yaparsam, bazı URL'leri tutmak için yeterli olmayan bir varcharla (333) sınırlı olacağım. Sütunu latin1 olarak bildirirsem, o zaman tam 1000 karakter elde ederim (buna çok ihtiyacım olduğunu düşünmüyorum). Bununla birlikte, URL'yi kodlamalıyım ve her zaman kodlanmış URL ile çalışırken tutarlı olmalıyım. Büyük URL kümelerini yönetmenin daha iyi bir yolu var mı?Mysql'de URL'leri depolamanın en etkili yolu?

cevap

5

bir şey. Bu, daha sonra, belirli bir ana bilgisayar için tüm URL'leri almanın yanı sıra dize uzunluğu endişelerinize yardımcı olmanız için de yararlı olabilir. Örneğin

: Bunu yapmak için

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

Bazı sorgu dizeleri uzun olabilir: http://www.foo.com/index.jsp? A = 1 & b = 2 & c = 3 ..................... .......................... & z = uuuuggggghhhh –

+0

Anlaşıldı. Bir longneck'in bir metin alanı kullanma önerisi yoluna gitmek isteyebilirsiniz. Daha fazla URL'lerin uzunluğuna yardımcı olmanın yan etkisi ile "büyük URL kümelerini yönetmenin daha iyi bir yolu var" şeklinde geliyordum.URL'leri nasıl kullandığınıza bağlı olarak yapmak isteyebileceğiniz bir şey de, DOMAIN tablosuna bir domain_key sahip HOSTS tablosuyla ana bilgisayar adı ve etki alanına bölünmesidir. Bu, bir alan adındaki önemsiz tüm URL'leri bulmayı sağlayabilir. –

+0

URL'leri çok uzun sürebilir - http://www.boutell.com/newfaq/misc/urllength.html – cjroth

0

i'nin çarpışma kontrolü ile bir karma algoritması kullanarak biliyorum en yaygın uygulama, sadece URL'ler üzerinde çok düşük çarpışma üretecek hızlı bir şekilde kodlama çeşit kullanın.

Tüm URL'ler boyunca aynı olacağını bildiğiniz parçaları (yani HTTP: //, www, vs ...) doğramaya çalışın. URL'ler alanınızın bir parçasıysa, bunu da kesin.

Aksi takdirde, ben sorunu yeniden düşünmek ve denemek ve başarmak için çalışıyoruz ne olursa olsun başarmak için farklı bir yol bulmak istiyorum. Benzersiz bir URL kümesinin gerçekten başka bir sorunu çözdüğünü varsayalım. Eğer ayrı tabloda URL'nin ana makine adı ve protokol kısmını saklamak ve bir anahtar yoluyla başvuruda bulunuyor düşünmek olabilir

+2

Onun URL'ler depolamak neden hakkında yanlış varsayımlar muhtemelen ne yapıyoruz. Muhtemelen www, vb. Kesmek/güvenli değil. –

+0

Bir örnek verebilir misiniz? Http ve www'yi kaldırarak orijinal URL'yi kolayca yeniden üretebilirsiniz, tanım bütünlüğünü etkilemez ... Bunu açıklayabilir misiniz? –

+5

Bu yanlış. Http://www.foo.com ve http://foo.com'un aynı URL'ye başvurduğuna dair bir garanti yoktur. Https://www.foo.com ve http://foo.com olsun. –

9

üç iyi yolu:

1) yerine VARCHAR METİN kullanın. benzersizliği sağlamak için, bir MD5() veya SHA1() karma değerini saklamak ve bir UNIQUE veya PRIMARY dizini eklemek için ayrı bir VARCHAR sütunu oluşturmanız gerekir. Bu URL almak için ek bir disk arama talihsiz sonucuna sahiptir, ancak kullanım durumunuza bağlı olarak Tamam olabilir.

2) ikili harmanlama ile VARCHAR ve sıkıştırmak kullanarak URL'yi() sıkıştırmak. İlk iki yazarak gibi

3) Üçüncü unuttun. grr ...

+1

+1, kişisel olarak # 1 ile giderdim (URL’nin değil, URL’nin karmasına benzersiz sınırlar koyma kendisi) bulunur. – nathan

+0

Bu nedenle, VARCHAR URL sütununu birincil olarak ayarlamak yerine karma için başka bir sütun oluşturmalıyım? – User

+0

İki ayrı öneride bulundum. Birinin diğerinden daha iyi olduğunu söylemedim. Kullanım durumunuz için en uygun olanı seçmelisiniz. – longneck

İlgili konular