2010-08-22 24 views
7

İki tablo içeren bir veritabanı var. Sorun şu ki, her gönderide herhangi bir sayıda etiket bulunabilir. Başka bir deyişle, bir 'tag1', 'tag2' vb. Sütununa sahip olamaz ve bir SOL JOIN yapar.Etiketleri bir veritabanında depolamanın en iyi yolu?</p> <ul> <li>girdileri</li> <li>etiketler</li> </ul> <p>girişleri tabloda her bir veya daha fazla etiket var Mesajları içerir:

Her gönderinin herhangi bir sayıda etiket içermesi için girdileri nasıl ayarlamalıyım?

cevap

11

Bir eşleme tablosuna ihtiyacınız var. Her iki girdileri üzerindeki çok anahtarla, entry_id ve tag_id:

iki sütun içerir entries_tags adlı bir tablo oluşturun.

Buna, çoktan çoğuna numaralı adı verilir.

Sen ilaveten bir kavşak/eşleştirme/kavşak tablosunu sahip için, sen taggable var girişinde etiketlerin bir listesi var SO yönlü, bunu da yapabilirsiniz
+0

Yea ve hiçbir girişin yinelenen etiketi olmadığından emin olun. Güncelleme etiketi, mevcut olanların kalmasını, yenilerinin eklendiğini, silinmiş olanların kaldırılmasını sağlamanız gerektiğinden birazcık zor olacaktır. Tabii ki, her zaman hepsini kaldırabilir ve daha sonra bunları karşılaştırma zahmetinden kurtarmak için hepsini tekrar ekleyebilirsiniz. Artıları ve eksileri söyleyebilirim. –

+1

@ o.k.w: Tüm bu sorunları yabancı anahtar kısıtlamaları ve işlem güncellemeleri ile halledebilirsiniz. – Borealid

+0

@ o.k.w: Ayrıca, bir birincil anahtar (tercih edilir) veya her iki sütunda benzersiz bir kısıtlama, kombinasyon başına benzersizliği garanti eder. –

3

:

entries table: 
post_id: 3539744, .... tags: sql, database, database-design, tags, data-modeling 

Eğer Bir girdinin ilişkili etiketlerini çekerken birleşim tablosunu kullanarak performans isabetini alamaz. Elbette, denormalize edilmiş verilerle uğraştığınız için, bu konuya daha fazla dikkat edilmelidir.

İlgili konular