Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zaprojektować tabelę MySql dla chmury tagów?

Ogólnie rzecz biorąc, dla tego rodzaju relacji wiele-do-wielu istnieją trzy tabele:

  • article " tabela
    • klucz podstawowy =identyfikator
  • tag " tabela
    • klucz podstawowy =identyfikator
    • zawiera dane każdego tagu :
      • na przykład imię i nazwisko
  • tags_articles " tabela, która działa jak tabela łączenia i zawiera tylko :
    • id_article :klucz obcy wskazujący na artykuł
    • id_tag :klucz obcy wskazujący na tag


W ten sposób nie ma duplikacji danych żadnego znacznika :dla każdego znacznika jest jeden i tylko jeden wiersz w tag tabela.

I dla każdego artykułu możesz mieć kilka tagów (tj. kilka linii w tags_articles stół); i oczywiście dla każdego tagu możesz mieć kilka artykułów.

Uzyskanie listy tagów dla artykułu, z tym pomysłem, jest kwestią dodatkowego zapytania, takiego jak:

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


Pobranie trzech „najbardziej podobnych” artykułów oznaczałoby:

  • wybierz artykuły, które mają tagi, które ma pierwszy artykuł
  • używaj tylko tych, które mają najważniejszą liczbę identycznych tagów

Nie testowano, ale pomysł może wyglądać tak:

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

Zasadniczo:

  • wybierz identyfikatory artykułów dla każdego tagu znajdującego się w początkowym artykule
    • ponieważ istnieje sprzężenie wewnętrzne, jeśli artykuł w bazie danych ma 2 znaczniki, które pasują do where klauzula, bez group by klauzula, w tym artykule byłyby dwie linijki
    • Oczywiście nie chcesz ponownie wybierać artykułu, który już miałeś – co oznacza, że ​​należy go wykluczyć.
  • ale, ponieważ używasz group by article.id , w artykule będzie tylko jeden wiersz
    • ale będziesz mógł użyć count , aby dowiedzieć się, ile tagów jest wspólnych dla każdego artykułu z początkowym
  • w takim razie jest to tylko kwestia sortowania według liczby tagów i uzyskania tylko trzech trzecich linii.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zablokuj tabelę mysql za pomocą php

  2. Wykryj, czy wartość jest liczbą w MySQL

  3. Metoda uwierzytelniania „mysql_old_password” nie jest obsługiwana

  4. SQL ORDER BY wiele kolumn

  5. MySQL:wybierz * z tabeli, gdzie col IN (null, ) możliwe bez OR