Biasanya saya setuju dengan Yaakov Ellis tetapi dalam kasus khusus ini ada solusi lain yang layak:
Gunakan dua tabel:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
Ini memiliki beberapa keunggulan utama:
Pertama itu membuat pengembangan lebih sederhana: dalam solusi tiga-tabel untuk memasukkan dan memperbarui item
Anda harus mencari Tag
tabel untuk melihat apakah sudah ada entri. Maka Anda harus bergabung dengan mereka dengan yang baru. Ini bukan tugas sepele.
Maka itu membuat kueri lebih sederhana (dan mungkin lebih cepat) Ada tiga permintaan basis data utama yang akan Anda lakukan: Keluarkan semua Tags
untuk satu Item
, gambarkan Tag-Cloud dan pilih semua item untuk satu Judul Tag.
Semua Tag untuk satu Item:
3-Meja:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2-Meja:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
Tag-Cloud:
3-Meja:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2-Meja:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
Item untuk satu Tag:
3-Meja:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
2-Meja:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
Tetapi ada beberapa kelemahan juga: Ini bisa mengambil lebih banyak ruang dalam database (yang dapat menyebabkan lebih banyak operasi disk yang lebih lambat) dan itu tidak dinormalisasi yang dapat menyebabkan inkonsistensi.
Argumen ukuran tidak terlalu kuat karena sifat tag adalah bahwa mereka biasanya cukup kecil sehingga peningkatan ukurannya tidak besar. Orang bisa berargumen bahwa permintaan untuk judul tag jauh lebih cepat dalam sebuah tabel kecil yang berisi setiap tag hanya sekali dan ini tentunya benar. Tetapi dengan mempertimbangkan penghematan karena tidak harus bergabung dan fakta bahwa Anda dapat membangun indeks yang baik pada mereka dapat dengan mudah mengimbangi ini. Ini tentu saja sangat tergantung pada ukuran database yang Anda gunakan.
Argumen inkonsistensi juga sedikit diperdebatkan. Tag adalah bidang teks gratis dan tidak ada operasi yang diharapkan seperti 'ganti nama semua tag "foo" menjadi "bar"'.
Jadi tldr: Saya akan mencari solusi dua meja. (Sebenarnya saya akan. Saya menemukan artikel ini untuk melihat apakah ada argumen yang valid menentangnya.)