Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mendesain Tabel MySql untuk Tag Cloud?

Umumnya, untuk hubungan banyak ke banyak ini, ada tiga tabel :

  • "article " tabel
    • kunci utama =id
  • "tag " tabel
    • kunci utama =id
    • berisi data setiap tag :
      • nama, misalnya
  • Sebuah "tags_articles " tabel, yang bertindak sebagai tabel gabungan, dan hanya berisi :
    • id_article :kunci asing yang menunjuk ke sebuah artikel
    • id_tag :kunci asing yang menunjuk ke sebuah tag


Dengan cara ini, tidak ada duplikasi data tag apapun :untuk setiap tag, ada satu, dan hanya satu, baris di tag tabel.

Dan, untuk setiap artikel, Anda dapat memiliki beberapa tag (yaitu beberapa baris di tags_articles meja); dan, tentu saja, untuk setiap tag, Anda dapat memiliki beberapa artikel.

Mendapatkan daftar tag untuk sebuah artikel, dengan ide ini, adalah masalah kueri tambahan, seperti :

select tag.*
from tag
    inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123


Mendapatkan tiga artikel "paling mirip" berarti :

  • pilih artikel yang memiliki tag seperti artikel pertama
  • hanya gunakan yang memiliki jumlah tag identik yang paling penting

Belum diuji, tetapi idenya mungkin seperti ini :

select article.id, count(*) as nb_identical_tags
from article
    inner join tags_articles on tags_articles.id_article = article.id
    inner join tag on tag.id = tags_articles.id_tag
where tag.name in ('php', 'mysql', 'erlang')
      and article.id <> 123
group by article.id
order by count(*) desc
limit 3

Pada dasarnya, Anda :

  • pilih id artikel untuk setiap tag yang ada di artikel awal Anda
    • karena ada inner join, jika artikel di DB memiliki 2 tag yang cocok dengan where klausa, tanpa group by klausa, akan ada dua baris untuk artikel itu
    • tentu saja, Anda tidak ingin memilih kembali artikel yang sudah Anda miliki -- yang berarti artikel tersebut harus dikecualikan.
  • tetapi, saat Anda menggunakan group by article.id , hanya akan ada satu baris per artikel
    • tetapi Anda dapat menggunakan count , untuk mengetahui berapa banyak kesamaan tag yang dimiliki setiap artikel dengan tag awal
  • lalu, ini hanya masalah pengurutan per jumlah tag, dan hanya mendapatkan tiga baris ketiga.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih 3 skor tertinggi setiap hari untuk setiap pengguna

  2. MySQL tidak mendukung komentar satu baris di sini. Apa alasannya?

  3. MySQL:Kolom Terhitung

  4. MIN() – Temukan Nilai Minimum dalam Kolom di MySQL

  5. Campuran ilegal dari kesalahan susunan di MySql