2016-12-24 366 views
0

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

+0

如果我使用有限的标签,假设它们总共有20个,那该怎么办。然后,我需要创建20列,并假设某些用户给出的标签较少(大多数情况下都是这种情况)。在这种情况下,大多数列将是空的。在这种情况下做什么,通过允许这么多表格条目为空的方式来设计好的设计? – Republic

回答

5

这是一个经典的n关系。像这样

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' 
+0

谢谢。如果我使用有限的标签,假设他们总共有20个。然后,我需要创建20列,并假设某些用户给出的标签较少(大多数情况下都是这种情况)。在这种情况下,大多数列将是空的。在这种情况下做什么,通过允许这么多表格条目为空的方式来设计好的设计? – Republic

+0

我在答案中提到的设计是无论标签多少,固定或不固定都要选择的设计。那么如果有最大值。每个帖子只有一个标签,那么你当然不会这样做。 –

0

我会做的是:制作一个单独的表格,用于存储标签的名称。然后,您必须使用外键,并且在选择标签时,您必须将每个条目链接到行中您的标签表。这将允许你存储'无限标签',因为你可以继续添加到标签表。

-1

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

  1. 至于对方的回答表明,创建tags表中的数据库具体。这是做这件事的最传统的方式。例如,wordpress有tagscategories表,该表链接到posts表,其中存储由用户发布的每个帖子。
  2. 另一种方法是将它存储在主表中的json字段(现在大多数数据库都包括mysql和pgsql),而不是存储在单独的tags表中。这样做的好处是,当一个连接被取消时,你的查询会更快。缺点是,你不会得到正常化的通常好处,即有效的存储大小。
  3. 另一种快速和肮脏,但“老派”的做法是在单个备忘录或LOB字段中使用分隔符来存储标签。使用逗号分隔符,它将类似于:html,css,javascript,然后在您想要处理它们时使用分隔符进行分割。当然,明显的缺点是你不能使用该分隔符(在这个例子中是逗号)作为标签的一部分。
+1

消除JOIN以某种方式提高查询性能的想法很容易被误导 – Strawberry