Как создать базу данных для списка интересных тем пользователей? - PullRequest
2 голосов
/ 07 ноября 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

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

Interests :- id, interest

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

UserInterests :- user_id, interest_id

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

ProjectInterest :- project_id, interest_id

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

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>
0 голосов
/ 07 ноября 2011

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

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

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

Теперь у вас есть список уникальных комбинаций пользователей и интересов.Допустим, у вас есть список новостных статей, каждая из которых имеет отдельную тему («интерес»).Теперь вы можете сделать что-то вроде

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

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

...