Как создать базу данных для списка тем, которые интересуют пользователей?

#php #mysql #sql #database #categories

#php #mysql #sql #База данных #Категории

Вопрос:

Для сайта, над которым я работаю, я хочу, чтобы пользователь имел возможность отмечать несколько полей, которые представляют то, что его / ее может заинтересовать, подобно StumbleUpon. Пользователь должен проверить «веб-разработка» и «веб-дизайн», затем нажать «Отправить», который затем сохранит его предпочтения в базе данных.

Позже, если кто-то создаст проект, помеченный одним из выбранных им параметров, этот пользователь получит обновление. Итак, если бы я создал новый проект с надписью «Создание веб-сайта» и проверил категорию «веб-разработка», все пользователи, у которых в личных профилях было выбрано «веб-разработка», получили бы какое-нибудь сообщение или электронное письмо, предупреждающее их о недавно созданной теме.

Каков наилучший способ реализовать это в формате MySQL? Я просмотрел несколько страниц по управлению иерархическими данными (там будут общие категории, такие как «Компьютеры» или «Музыка», и администратор сможет добавлять / удалять / редактировать категории), но ни один из методов не показался мне тем, что мне нужно — по крайней мере, не в том смысле, в котором я застрял. Возможно, есть более простой ответ, который я упустил из виду?

Ответ №1:

Создайте таблицу, содержащую различные интересы. Скажите

 Interests :- id, interest
  

Затем таблица, в которой хранятся все интересы, выбранные пользователем, как

 UserInterests :- user_id, interest_id
  

И отношение интереса к проекту как

 ProjectInterest :- project_id, interest_id
  

Теперь, когда добавлен новый проект, вы можете запустить запрос, подобный следующему onw, чтобы сообщить пользователям, что проект представляет интерес

 SELECT DISTINCT user_id
FROM UserInterests ui, ProjectInterests pi 
WHERE ui.interest_id = pi.interest_id AND pi.project_id = <new project id>
  

Или, используя явный синтаксис объединения:

 SELECT DISTINCT user_id
FROM UserInterests ui
  INNER JOIN ProjectInterests pi ON ui.interest_id = pi.interest_id
WHERE pi.project_id = <new project id>
  

Комментарии:

1. DISTINCT всегда применяется ко всей строке, а не к определенному столбцу, поэтому нет необходимости заключать имя столбца в квадратные скобки, например DISTINCT(user_id) .

Ответ №2:

Я думаю, вы спрашиваете о том, как реализовать отношение «многие ко многим». Проблема в том, что вы не можете предоставить пользователю список интересов, не ограничивая себя точным количеством интересов, которые он может выбрать.

Решением является таблица соединений. С одной стороны, у вас есть свой список пользователей, а с другой стороны, у вас есть свой список интересов. Таблица соединений — это третья таблица, в которой перечислены отношения между этими двумя группами.

 CREATE TABLE `user_interest` (
    userid UNSIGNED INT REFERENCES `user` (userid),
    interestid UNSIGNED INT REFERENCES `interests` (interestid),
    PRIMARY KEY (interestid, userid)
)
  

Теперь у вас есть список УНИКАЛЬНЫХ комбинаций пользователей и интересов. Допустим, у вас есть список новостных статей, каждой из которых присвоена отдельная тема («interestid»). Теперь вы можете сделать что-то вроде,

 SELECT * FROM `article` WHERE `article`.`interestid` IN (
  SELECT `interestid` FROM `user_interest` WHERE `userid` = X
)
  

Которая извлекает список статей, связанных с выбранными интересами пользователя X. Сначала вы получаете список тем, которые были связаны с указанным вами пользователем, затем вы получаете список статей с соответствующими темами.