PHP Etiket Bulutu

5 Cevap php

Ben veritabanı düzeni değil, gerçek "bulut" kendisi ile ilgili yardım arıyorum.

Kullanıcıların görüntüleri göndermek ve görüntüleri etiketleyebilirsiniz bir site, nasıl veritabanı optimum performans için kurulum olmalıdır?

Düşünüyordum

ID - int(11), unique, auto_incremenet
tag - varchar(20)
imageID - int(11)

bu yüzden bir resim upload varsayalım, ve "toronto, sushi, yaz" etiketleyebilirsiniz.

Sorgu olacaktır:

INSERT INTO tags (tag, imageID) VALUES ('$tag[0]', $imageID);
INSERT INTO tags (tag, imageID) VALUES ('$tag[1]', $imageID);
INSERT INTO tags (tag, imageID) VALUES ('$tag[2]', $imageID);

Sonra almak için, ben ImageId = $ imagID etiketleri * seçmek istiyorum.

Bu bir kusur var mı?

5 Cevap

Bir habtm (ve birçok ait) iki tablo görüntüler için bir, etiketleri için bir ilişkisi ve görüntü kimlikleri ve etiket kimlikleri kombinasyonları ile üçüncü bir tablo olmalıdır. Bir resim, bir etiketi var veya görüntü sayısı için etiketleri sayısını sınırlamak gerekmez Bu şekilde üye olabilir ve çoğaltmayı yok.

Ben aynı etiketi paylaşan veritabanında yinelenen girdileri görüntüleri dışında bu yaklaşım ile gerçek bir sorun görmüyorum. Eğer olsa normalleştirmek için çalışırsanız, bu durumda zaman kaybı (kodlama katılma ve MySQL için tabloları geçme) gibi görünüyor etiketleri kendilerini tutan başka bir masaya yinelenen başvurular içeren bir tablo ile sonuna kadar.

Ben düşünün bir küçük optimizasyon olsa sütunların sırasıdır. Grup 'int Birlikte, onlar anlam MySQL için sabit genişlik gibi onlar int, varchar int daha bu sırayla marjinal hızlı aranabilir.

Char (20) için etiket alanı değiştirerek de performansını artırmak istiyorsunuz? Bütün tablo sabit genişlikte olacak ve sorguları genelde daha hızlı olan sabit genişlikli masalarda çalışacak - ben DB tasarım benim son çalışmada inanıyoruz yol.

20 karakter sabitlenir tablo kapladığı alan miktarı açısından biraz yükünü neden, ama yine de biraz daha büyük bir dosya boyutu büyük bir sorun olarak göremiyorum böyle küçük bir tablo olacaktır.

Aslında çok küçük bir tablo olduğu için ben varchar (20) ve char (20) arasında bir fark gördüm önce veri satırları çok ihtiyacımız olacağını hayal, o söyledikten sonra.

Sadece bir düşünce. :)

I would use a separate tag table: TABLE tags: tag_id- int(11), unique, auto_incremenet tag - varchar(20)

TABLE image tags:
ID - int(11), unique, auto_incremenet
tag - varchar(20)
imageID - int(11)

Sonra etiketi var zaten varsa bakmak istiyorum ve sadece kimlikleri gireceğiz

INSERT INTO tags (tag, imageID) VALUES ('$tag_id[0]', $imageID); INSERT INTO tags (tag, imageID) VALUES ('$tag_id[1]', $imageID); INSERT INTO tags (tag, imageID) VALUES ('$tag_id[2]', $imageID);

In this way images with same tags will be easier to find as they share same tag_id and not only the same varchar content. Of course you should transorm the tags into lowercase and replace special chars, etc.

ImageId alanında bulunan bir dizin olduğundan emin olun.