如何使用MySQL和PHP将标签存储在数据库中?

4

我希望创建一个数据库,用于存储用户为其问题输入的标签,并在发布每个独立问题时显示它们,类似于 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)
);

我知道这不正确。如果需要的话,我需要哪些其他表格以及需要对这个表格进行哪些更改?


是否与“questions”表有关系?还是你只有“questions_tags”这个表? - lutz
问题标签是我现在所拥有的全部,这就是为什么我在问的原因。 - php
3个回答

7
你应该将数据拆分为两个表,questionstags,并使用一个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未经测试。


计数列会统计每个标签被输入的次数,例如,假设HTML在该问题中已经被输入了20次。 - php
2
这样的 count 列包含冗余信息,不应该使用。 - lutz
那么我应该使用什么来跟踪每个问题输入标签的次数呢?例如,假设问题1已输入了5次HTML,而问题2已输入了2次HTML? - php
请看我的回答,那里有一个请求来统计标签被使用的次数。 - Roch
1
虽然可以争论为了加快SELECT查询的速度,值得拥有一个计数列。聚合函数如count()确实需要额外的处理时间,并且据我所知,不会被缓存。由于标签SELECT查询可以预期会经常运行,因此将其尽可能轻量化和快速化是值得的。 - Elise van Looij

2

表格:

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;

计数器增加标签以使它们更大,而URL捕获页面的URL。 - php
所有这些内容都将在标签表中。 - Roch
你可以通过简单的 SQL count 请求获取计数。 - Roch
那么标签表会长成什么样子,哪个表将用于在页面上显示标签? - php
我假设tags表将捕获每个标签的数量? - php

0
你可能需要一个n:m关系表来存储与你的“问题”表的关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接