Saya telah mendengar beberapa cara untuk menerapkan penandaan; menggunakan tabel pemetaan antara TagID dan ItemID (masuk akal bagi saya, tetapi apakah ini skala?), menambahkan sejumlah kolom TagID yang mungkin ke ItemID (sepertinya ide yang buruk), Menyimpan tag dalam kolom teks yang dipisahkan koma (terdengar gila tapi bisa bekerja). Saya bahkan pernah mendengar seseorang merekomendasikan matriks jarang, tetapi kemudian bagaimana nama tag tumbuh dengan anggun?
Apakah saya melewatkan praktik terbaik untuk tag?
sql
database-design
tags
data-modeling
tagging
dlamblin
sumber
sumber
Jawaban:
Tiga tabel (satu untuk menyimpan semua item, satu untuk semua tag, dan satu untuk hubungan antara keduanya), diindeks dengan benar, dengan kunci asing diatur berjalan pada database yang tepat, harus bekerja dengan baik dan skala dengan benar.
sumber
Biasanya saya setuju dengan Yaakov Ellis tetapi dalam kasus khusus ini ada solusi lain yang layak:
Gunakan dua tabel:
Ini memiliki beberapa keunggulan utama:
Pertama itu membuat pengembangan lebih sederhana: dalam solusi tiga-tabel untuk memasukkan dan memperbarui
item
Anda harus mencariTag
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 satuItem
, gambarkan Tag-Cloud dan pilih semua item untuk satu Judul Tag.Semua Tag untuk satu Item:
3-Meja:
2-Meja:
Tag-Cloud:
3-Meja:
2-Meja:
Item untuk satu Tag:
3-Meja:
2-Meja:
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.)
sumber
Jika Anda menggunakan basis data yang mendukung pengurangan peta, seperti couchdb, menyimpan tag di bidang teks biasa atau bidang daftar memang cara terbaik. Contoh:
Menjalankan ini dengan group = true akan mengelompokkan hasil berdasarkan nama tag, dan bahkan mengembalikan hitungan berapa kali tag ditemui. Ini sangat mirip dengan menghitung kemunculan kata dalam teks .
sumber
Gunakan kolom teks berformat tunggal [1] untuk menyimpan tag dan gunakan mesin pencari teks lengkap yang mampu mengindeks ini. Jika tidak, Anda akan mengalami masalah penskalaan saat mencoba menerapkan kueri boolean.
Jika Anda membutuhkan detail tentang tag yang Anda miliki, Anda dapat melacaknya di tabel yang dikelola secara bertahap atau menjalankan pekerjaan batch untuk mengekstrak informasi.
[1] Beberapa RDBMS bahkan menyediakan tipe array asli yang mungkin lebih cocok untuk penyimpanan dengan tidak memerlukan langkah penguraian, tetapi mungkin menyebabkan masalah dengan pencarian teks lengkap.
sumber
Saya selalu menyimpan tag di tabel terpisah dan kemudian memiliki tabel pemetaan. Tentu saja saya juga tidak pernah melakukan sesuatu dalam skala yang sangat besar.
Memiliki tabel "tag" dan tabel peta membuatnya cukup sepele untuk menghasilkan tag cloud & semacamnya karena Anda dapat dengan mudah mengumpulkan SQL untuk mendapatkan daftar tag dengan jumlah seberapa sering setiap tag digunakan.
sumber
Saya akan menyarankan desain berikut: Tabel Item: Itemid, taglist1, taglist2
ini akan cepat dan membuat mudah menyimpan dan mengambil data pada level item.
Secara paralel buat tabel lain: Tag tag tidak membuat tag pengidentifikasi unik dan jika Anda kehabisan ruang di kolom ke-2 yang berisi katakanlah 100 item buat baris lain.
Sekarang saat mencari item untuk sebuah tag, itu akan sangat cepat.
sumber