Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да проектираме MySql таблица за облак от маркери?

Обикновено за този вид връзка много към много има три таблици:

  • article " таблица
    • първичен ключ =идентификатор
  • Маркерът tag " таблица
    • първичен ключ =идентификатор
    • съдържа данните за всеки маркер :
      • име, например
  • A "tags_articles " таблица, която действа като таблица за присъединяване и съдържа само :
    • id_article :външен ключ, който сочи към статия
    • id_tag :външен ключ, който сочи към таг


По този начин няма дублиране на данни на нито един маркер:за всеки маркер има един и само един ред в tag таблица.

И за всяка статия можете да имате няколко маркера (т.е. няколко реда в tags_articles маса); и, разбира се, за всеки етикет можете да имате няколко статии.

Получаването на списък с тагове за статия с тази идея е въпрос на допълнителна заявка, като:

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


Получаването на трите „най-сходни“ статии би означавало:

  • изберете статии, които имат маркери, които има първата статия
  • използвайте само тези, които имат най-важния брой идентични тагове

Не е тестван, но идеята може да е нещо, което би изглеждало така:

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

По принцип вие :

  • изберете идентификаторите на статии за всеки маркер, който присъства в първоначалната ви статия
    • тъй като има вътрешно присъединяване, ако дадена статия в БД има 2 маркера, които съответстват на where клауза, без group by клауза, ще има два реда за тази статия
    • разбира се, не искате да избирате отново статията, която вече сте имали – което означава, че трябва да бъде изключена.
  • но, тъй като използвате group by article.id , ще има само един ред на статия
    • но ще можете да използвате count , за да разберете колко маркера има общи за всяка статия с първоначалната
  • тогава е въпрос само на сортиране по брой маркери и получаване само на третите три реда.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Достъпът е отказан за потребител 'root'@'localhost' (използвайки парола:ДА)

  2. Двупосочно DB криптиране сигурно дори от администратора

  3. как да се свържете с база данни на друг сървър

  4. Как да сравните производителността на Moodle

  5. mysql_fetch_array връща само един ред