Как хранить теги в базе данных, используя MySQL и PHP? - PullRequest
4 голосов
/ 03 декабря 2009

Я хотел создать базу данных, в которой будут храниться теги, которые пользователи вводят для своих вопросов, а затем отображать их все для каждого опубликованного вопроса; что-то вроде здесь, на SO.

Вот таблица, которая делает все для меня сейчас:

CREATE TABLE questions_tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
url TEXT NOT NULL,
tag VARCHAR(255) NOT NULL,
count INT NOT NULL,
PRIMARY KEY (id)
);

Я знаю, что это не правильно. Какие еще таблицы или таблицы мне нужны и что мне нужно изменить в этой таблице, если необходимо?

Ответы [ 3 ]

7 голосов
/ 03 декабря 2009

Вам следует разделить данные между двумя таблицами questions и tags и связать их, используя таблицу соединений questions_tags.

CREATE TABLE questions (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  url TEXT NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE tags (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  tag VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE questions_tags (
  question_id INT UNSIGNED NOT NULL REFERENCES questions,
  tag_id INT UNSIGNED NOT NULL REFERENCES tags
);

Я не уверен, для чего предназначен столбец count в исходной таблице, поэтому я пропустил его.

Используя приведенные выше таблицы, вы можете использовать объединения, чтобы найти все вопросы с определенным тегом или всеми тегами вопроса.

Редактировать

Чтобы подсчитать для каждого тега вы можете что-то вроде этого:

  SELECT tag,
         count(*) AS c
    FROM tags
GROUP BY tag;

Редактировать

Чтобы получить количество всех тегов для всех вопросов, сделайте следующее:

  SELECT t.tag,
         q.question_id,
         count(*) AS c
    FROM tags AS t,
         questions_tags AS qt
         questions AS q
   WHERE t.id = qt.tag_id
     AND qt.question_id = q.id         
GROUP BY t.id, q.id;

Если вы хотите только подсчет для конкретных тегов или вопросов, добавьте дополнительные пункты WHERE.

Примечание : все приведенные выше SQL не проверены.

2 голосов
/ 03 декабря 2009

Таблицы:

CREATE TABLE questions_tags (
tag_id INT INT NOT NULL,
question_id INT NOT NULL,
);

CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
tag VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);

SQL

Выберите тег, связанный с вопросом

SELECT     tag_id
FROM         question_tags
WHERE     question_id = $yourquestionid'

Выберите вопросы, связанные с тегом

SELECT     question_id
FROM         question_tags
WHERE     tag_id = $yourtagid'

Подсчитать, сколько раз использовался тег

SELECT COUNT(tag_id) 
FROM question_tags 
where tag_id=$yourtagid

Сделать облако тегов

SELECT COUNT(tag_id)
FROM question_tags 
GROUP BY tag;
0 голосов
/ 03 декабря 2009

Вам, вероятно, понадобится таблица отношений n: m, в которой хранятся отношения к вашей таблице вопросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...