Normalde Yaakov Ellis ile aynı fikirde olurdum ama bu özel durumda başka bir geçerli çözüm var:
İki tablo kullanın:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
Bunun bazı önemli avantajları vardır:
İlk olarak geliştirme çok daha basit hale gelir: ekleme ve güncelleme için üç tablolu çözümde , zaten giriş olup olmadığını görmek item
için Tag
tabloya bakmanız gerekir . O zaman onlara yenileriyle katılmak zorundasınız. Bu önemsiz bir görev değil.
Sonra sorguları basitleştirir (ve belki de daha hızlıdır). Yapacağınız üç büyük veritabanı sorgusu vardır: Tags
Biri için çıktı alın Item
, bir Tag-Cloud çizin ve bir Etiket Başlığı için tüm öğeleri seçin.
Bir Öğe için tüm Etiketler:
3-Tablosu:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2-Tablosu:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
Etiket Bulutu:
3-Tablosu:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2-Tablosu:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
Bir Etiket için öğeleri:
3-Tablosu:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
2-Tablosu:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
Ancak bazı dezavantajlar da var: Veritabanında daha fazla yer kaplayabilir (bu da daha yavaş disk işlemlerine yol açabilir) ve normalleşmez ve bu da tutarsızlıklara yol açabilir.
Boyut argümanı o kadar güçlü değildir, çünkü etiketlerin doğası normalde oldukça küçük olmalarıdır, böylece boyut artışı büyük değildir. Her bir etiketi sadece bir kez içeren küçük bir tabloda etiket başlığı sorgusunun çok daha hızlı olduğu iddia edilebilir ve bu kesinlikle doğrudur. Ancak katılmak zorunda kalmamanız için yapılan tasarruflar ve iyi bir endeks oluşturabileceğiniz gerçeği göz önüne alındığında bunu kolayca telafi edebilirsiniz. Bu elbette büyük ölçüde kullandığınız veritabanının boyutuna bağlıdır.
Tutarsızlık argümanı da biraz tartışmalı. Etiketler serbest metin alanlarıdır ve 'tüm etiketleri "foo" olarak "bar" olarak yeniden adlandırmak gibi beklenen bir işlem yoktur.
Yani tldr: İki tablolu çözümü tercih ederim. (Aslında yapacağım. Bu makaleye karşı geçerli argümanlar olup olmadığını görmek için buldum.)