如何在数据库中存储无限标签?

时间:2016-12-24 07:40:36

标签: php mysql database tags nosql

我正在开发一个网站,要求用户为其新创建的内容提供标记(类似于stackoverflow标记)。但是如何存储这个标签? ,如果使用mysql数据库,那么我必须设置列数限制和标签本身数量。既然我希望为用户提供无限制的标记选项,应遵循哪种方法?

3 个答案:

答案 0 :(得分:5)

这是一个经典的 n到m关系。喜欢这个

tags table
----------
id
name
...


content table
-------------
id
title
...

content_tags table
------------------
content_id
tag_id

要为单个内容存储多个标记,请在content_tags表中为您希望它拥有的每个标记添加记录。例如:

content_tags table
------------------
content_id |  tag_id
1          |  2
1          |  5
1          |  1

然后获取内容记录的标记:

select t.*
from tags t
join content_tags ct on ct.tag_id = t.id
join content c on ct.content_id = c.id
where c.title = 'my content title'

答案 1 :(得分:0)

我要做的是:创建一个单独的表,用于存储标签的名称。然后,您必须使用外键,实质上,当他们选择标签时,您的每个条目链接指向您的行标签表。这样您就可以存储“无限制的标记”,因为您可以继续添加标记表。

答案 2 :(得分:-1)

有多种方法可以解决这个问题:

  1. 正如另一个答案所示,请在数据库中专门创建一个tags表。这是最传统的做法。例如,wordpress有tagscategories表链接到posts表,其中存储了用户发布的每篇帖子。
  2. 另一种方法是将它存储在主表本身的json字段中(现在大多数数据库都包含mysql和pgsql),而不是存储在单独的tags表中。这样做的好处是,当一个连接被消除时,您的查询将更快。缺点是您不会获得标准化的通常好处,即有效的存储大小。
  3. 另一个快速而又肮脏但又老旧的学校"这样做的方法是在单个备忘录或LOB字段中使用分隔符来存储您的标记。使用逗号分隔符,它将类似于:html,css,javascript,然后在您想要处理它们时使用分隔符进行拆分。当然,明显的缺点是您无法使用该分隔符(在此示例中为逗号)作为标记的一部分。