Php 如何在数据库中存储无限的标签?
我在一个网站上工作,该网站要求用户为他们新创建的内容提供标签(类似于stackoverflow标签)。但是如何存储这些标签呢,如果使用mysql数据库,那么我必须对列数和标记数本身设置限制。既然我想给用户提供无限的标签选项,那么应该采用哪种方法?我想做的是:制作一个单独的表,将标签的名称存储在其中。然后,您必须使用外键,本质上,当他们选择标记时,您的每个条目链接都指向标记表中的行。这将允许您存储“无限标签”,因为您可以一直添加到标签表中。我要做的是:创建一个单独的表来存储标签的名称。然后,您必须使用外键,本质上,当他们选择标记时,您的每个条目链接都指向标记表中的行。这将允许您存储“无限标记”,因为您可以一直添加到标记表。这是一个典型的n到m关系。像这样Php 如何在数据库中存储无限的标签?,php,mysql,database,tags,nosql,Php,Mysql,Database,Tags,Nosql,我在一个网站上工作,该网站要求用户为他们新创建的内容提供标签(类似于stackoverflow标签)。但是如何存储这些标签呢,如果使用mysql数据库,那么我必须对列数和标记数本身设置限制。既然我想给用户提供无限的标签选项,那么应该采用哪种方法?我想做的是:制作一个单独的表,将标签的名称存储在其中。然后,您必须使用外键,本质上,当他们选择标记时,您的每个条目链接都指向标记表中的行。这将允许您存储“无限标签”,因为您可以一直添加到标签表中。我要做的是:创建一个单独的表来存储标签的名称。然后,您必须
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),而不是存储在单独的标记中。这样做的好处是,当一个连接被消除时,查询会更快。缺点是您无法获得正常化的通常好处,即有效的存储大小
html、css、javascript
,然后在需要处理它们时使用分隔符进行拆分。当然,明显的缺点是您不能将该分隔符(本例中为逗号)用作标记的一部分有多种方法可以解决此问题:
标记表。这是最传统的方法。例如,wordpress有标签
和类别
表,它们链接到帖子
表,用户发布的每篇帖子都存储在该表中
json
字段中(现在大多数数据库都有它,包括mysql和pgsql),而不是存储在单独的标记中。这样做的好处是,当一个连接被消除时,查询会更快。缺点是您无法获得正常化的通常好处,即有效的存储大小
html、css、javascript
,然后在需要处理它们时使用分隔符进行拆分。当然,明显的缺点是您不能将该分隔符(本例中为逗号)用作标记的一部分消除连接以某种方式提高查询性能的想法是错误的。消除连接以某种方式提高查询性能的想法是错误的。谢谢。如果我用有限的标签怎么办?假设它们总共有20个。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下该怎么办,允许如此多的表条目为空是一种好的设计吗?我在回答中提到的设计是一种可以选择的设计,无论有多少标记,固定的或不固定的。如果每个帖子只有一个标签,那么你当然不会这样做。谢谢。如果我用有限的标签怎么办?假设它们总共有20个。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下该怎么办,允许如此多的表条目为空是一种好的设计吗?我在回答中提到的设计是一种可以选择的设计,无论有多少标记,固定的或不固定的。好吧,如果每个帖子最多只有一个标签,那么你当然不会这样做。如果我使用有限的标签怎么办?假设它们总共有20个。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下该怎么办,顺便问一下,允许这么多表条目为空是一种好的设计吗?如果我使用有限的标记,假设它们总共有20个呢。然后我需要创建20列,并假设一些用户提供的标签较少(大多数情况下都是这样)。在这种情况下,大多数列将为空。在这种情况下,允许这么多表项为空是一种好的设计吗?