Bir etiketleme sistemi için bir başlangıç ​​noktası arıyorsunuz

3 Cevap php

Temelde kurulum yığın taşması gibi bir etiketleme sistemi istiyoruz sahip girdileri ve alaka tabanlı arama çalışması nasıl planlamak için çalıştıkları için. Ben ilgili kayıtları bölüm için benzer etiketli girişleri yukarı çekmek için bir seçenek olmasını istiyorum. Şu anda etiketleri için iki tablo, her benzersiz etiket ve katılmak tablo için bir tablo kullanıyorum. Ben benzer etiketleri paylaşan girişlerin bir listesini oluşturmak için güçlü olmak için çalışacağını eğer düşünmeye çalışıyorum.

Herkes herhangi bir fikir, ya da makalelerin bağlantıları varsa benim beyin şaşırtıcı olurdu doğru yönde ilerliyor almak için onun okuyabilir. Teşekkür ederiz!

3 Cevap

kişiler tabloya bir daha fazla alan ekleyin: etiketleri. virgül dize etiketleri ayrılmış olan, 2 daha kişiler listesinin seçimi için katıldı önlemek için.

Belki ilgili kayıtları saklamak için ayrı bir tablo olabilir.

EntryId RelatedEntryId

Sonra bir CRON iş periyodik ilişkileri recompute ve tablosunu güncelleştirmek olabilir. Bu anında bu ilişkiyi hesaplamak için çalışırken daha az pahalı olacaktır.

Bir etiketi başka bir bağlı ne sıklıkta takip etmek gerekir. Gibi, "php" ve "sql-server" 3 olabilir iken, "php" ve "mysql" payı 50 makaleleri (veya ne olursa olsun yadsınacaktır ana içeriği) söylüyorlar ve "php" ve "apache" 25 var. So Verilen "php," Eğer (muhtemelen yol kenarına için "sql-server" güz izin) bu sırayla "mysql" ve "apache" geri dönmek isterdim.

Hiçbir şekilde sadece (ben şimdi görüyorum, ve stephenc cevabı üzerinde genişleyen tür) yüksek sesle düşünerek, bu idealdir:

CREATE TABLE tag_relations (
tag_id int unsigned not null,
related_tag_id int unsigned not null,
relation_count smallint unsigned not null,
PRIMARY KEY (tag_id, related_tag_id),
KEY relation_count (relation_count)
);

Sonra 1 ile relation_count artan bir makalede, diğer tüm etiketleri ve INSERT / UPDATE döngü, bağlı her benzersiz etiket için. Araçları ("php", "mysql") ve ("mysql", "php") tamamen iki That Farklı ilişkileri muhafaza edilecek, ancak arama kavramlar aracılığıyla kazma olmadan ben muhtemelen unutmuş, hala işlev olacak. Şey 10 + etiketleri varsa, güncellemeleri (belki stephenc gibi önerdi cron bu pass) çok yavaş olacak, ancak bu şekilde arama yapmak daha kolay olacak. Güzel ve çok basit gibi:

SELECT related_tag_id, COUNT(relation_count) AS total_relations
FROM tag_relations
WHERE tag_id IN ([list,of,tag,IDs,to,compare])
// AND tag_id NOT IN ([list,of,tag,IDs,to,compare]) -- probably
GROUP BY related_tag_id
ORDER BY total_relations DESC

Her iki tag_id & karşı denetlemek zorunda daha kolay related_tag_id ve sorgular bir karmaşa yoluyla Özetle, en azından. Gerçek tagnames & almak için etiketleri masaya JOIN hazırsınız.

Eğer "php" ve "mysql," yukarı arıyorsanız ve "apache" sık sık hem ilgilidir eğer sayma & beri Yani, en yakın olacak Her ortak ilişkiyi ağırlık. Kesinlikle olsa ortak bağlantıları sınırlamak, yani HAVING total_relations >= x (x keyfi bir kesim olma) ve / veya sadece normal LIMIT x alakalı şeyler tutmak eklemek olmaz.

(Not:. Bu hatta biraz kullanışlı olduğunu düşünerek önce bu dışarı halt araştırma - Ben orada bazı bilinen algoritma olduğunu 100x zeki dışarı var ve ben sadece bunu hatırlayarak değilim eminim)

PHPro.org benzer bir fikri kullanarak, çok bir good writeup vardır.