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

Php 如何在数据库中存储无限的标签?,php,mysql,database,tags,nosql,Php,Mysql,Database,Tags,Nosql,我在一个网站上工作,该网站要求用户为他们新创建的内容提供标签(类似于stackoverflow标签)。但是如何存储这些标签呢,如果使用mysql数据库,那么我必须对列数和标记数本身设置限制。既然我想给用户提供无限的标签选项,那么应该采用哪种方法?我想做的是:制作一个单独的表,将标签的名称存储在其中。然后,您必须使用外键,本质上,当他们选择标记时,您的每个条目链接都指向标记表中的行。这将允许您存储“无限标签”,因为您可以一直添加到标签表中。我要做的是:创建一个单独的表来存储标签的名称。然后,您必须

我在一个网站上工作,该网站要求用户为他们新创建的内容提供标签(类似于stackoverflow标签)。但是如何存储这些标签呢,如果使用mysql数据库,那么我必须对列数和标记数本身设置限制。既然我想给用户提供无限的标签选项,那么应该采用哪种方法?

我想做的是:制作一个单独的表,将标签的名称存储在其中。然后,您必须使用外键,本质上,当他们选择标记时,您的每个条目链接都指向标记表中的行。这将允许您存储“无限标签”,因为您可以一直添加到标签表中。

我要做的是:创建一个单独的表来存储标签的名称。然后,您必须使用外键,本质上,当他们选择标记时,您的每个条目链接都指向标记表中的行。这将允许您存储“无限标记”,因为您可以一直添加到标记表。

这是一个典型的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'
这是一个典型的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'

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

  • 正如另一个答案所建议的那样,在数据库中创建一个
    标记
    表。这是最传统的方法。例如,wordpress有
    标签
    类别
    表,它们链接到
    帖子
    表,用户发布的每篇帖子都存储在该表中
  • 另一种方法是将其存储在主表本身的
    json
    字段中(现在大多数数据库都有它,包括mysql和pgsql),而不是存储在单独的
    标记中。这样做的好处是,当一个连接被消除时,查询会更快。缺点是您无法获得正常化的通常好处,即有效的存储大小
  • 另一种快速而肮脏但“老派”的方法是在单个备注或LOB字段中使用分隔符来存储标记。使用逗号分隔符,它将类似于:
    html、css、javascript
    ,然后在需要处理它们时使用分隔符进行拆分。当然,明显的缺点是您不能将该分隔符(本例中为逗号)用作标记的一部分

  • 有多种方法可以解决此问题:

  • 正如另一个答案所建议的那样,在数据库中创建一个
    标记
    表。这是最传统的方法。例如,wordpress有
    标签
    类别
    表,它们链接到
    帖子
    表,用户发布的每篇帖子都存储在该表中
  • 另一种方法是将其存储在主表本身的
    json
    字段中(现在大多数数据库都有它,包括mysql和pgsql),而不是存储在单独的
    标记中。这样做的好处是,当一个连接被消除时,查询会更快。缺点是您无法获得正常化的通常好处,即有效的存储大小
  • 另一种快速而肮脏但“老派”的方法是在单个备注或LOB字段中使用分隔符来存储标记。使用逗号分隔符,它将类似于:
    html、css、javascript
    ,然后在需要处理它们时使用分隔符进行拆分。当然,明显的缺点是您不能将该分隔符(本例中为逗号)用作标记的一部分

  • 消除连接以某种方式提高查询性能的想法是错误的。消除连接以某种方式提高查询性能的想法是错误的。谢谢。如果我用有限的标签怎么办?假设它们总共有20个。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下该怎么办,允许如此多的表条目为空是一种好的设计吗?我在回答中提到的设计是一种可以选择的设计,无论有多少标记,固定的或不固定的。如果每个帖子只有一个标签,那么你当然不会这样做。谢谢。如果我用有限的标签怎么办?假设它们总共有20个。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下该怎么办,允许如此多的表条目为空是一种好的设计吗?我在回答中提到的设计是一种可以选择的设计,无论有多少标记,固定的或不固定的。好吧,如果每个帖子最多只有一个标签,那么你当然不会这样做。如果我使用有限的标签怎么办?假设它们总共有20个。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下该怎么办,顺便问一下,允许这么多表条目为空是一种好的设计吗?如果我使用有限的标记,假设它们总共有20个呢。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下,允许这么多表项为空是一种好的设计吗?