Database design 存储标签或类别(如堆栈溢出)的最佳方法

Database design 存储标签或类别(如堆栈溢出)的最佳方法,database-design,Database Design,我有一个提问web应用程序,它允许用户就特定的事情提问。我正在为每个问题开发一个标签样式的标签,就像堆栈溢出一样。当我把每一篇文章与类别或标签联系起来时,我想知道存储这些内容的最佳方式是什么。以下是我认为最理想的方法: -在sql数据库中创建一列来存储序列化的json对象,或者只存储一行逗号分隔的行,其中包含问题所属类别的ID 我觉得这种方法很难根据特定的标签来搜索问题,因为它必须解析每个问题的categories列,这似乎并不理想。设计此功能的好方法是什么,既能很好地适应搜索,又能使模式相当简

我有一个提问web应用程序,它允许用户就特定的事情提问。我正在为每个问题开发一个标签样式的标签,就像堆栈溢出一样。当我把每一篇文章与类别或标签联系起来时,我想知道存储这些内容的最佳方式是什么。以下是我认为最理想的方法:

-在sql数据库中创建一列来存储序列化的json对象,或者只存储一行逗号分隔的行,其中包含问题所属类别的ID


我觉得这种方法很难根据特定的标签来搜索问题,因为它必须解析每个问题的categories列,这似乎并不理想。设计此功能的好方法是什么,既能很好地适应搜索,又能使模式相当简单(请记住,我的主要目标是使标记尽可能类似于stackoverflow)?

好吧,简单地说,为什么不使用三个表遵循规范化方法呢:

问题D(QId,姓名)

标记(标记ID、名称)

每个主题的标记(QId、tagId)


非常简单……

最好的方法是使用外键

有一个表存储具有唯一ID的问题/项目。 (项目ID、信息1、信息2、信息3…)

另一个表存储所有可能的标记及其唯一ID。 (标签ID、标签名称)

最后一个表将两者链接在一起。
(item\u ID,tag\u ID)

每个帖子都会在某个表中包含一个ID,其中包含您计划包含的内容。让我们称之为“帖子”

每个post标记将位于另一个表中,该表具有post_id和标记(以及您可能喜欢的任何审核列)“post_标记”

然后,作为管理员,您可以(可选地)将记录添加到“标记”查找表中,以查找您想要很好地定义的标记,即la

只是一个简单的关系

例如:

table: [questions]
[TableId][name]
'1' - 'general'

table: [Tags]
[TagId][name]
'99' - 'c#'

table: [QuestionsTagged]
[TableId][TagId]
'1' - '99'

然后用

将它们链接在一起。注意,如果这个问题与C#或ASP.NET有关的话,那么这个问题几乎没有什么关系,这更多的是关于数据库设计的。对此,我说一个问题可以有很多标签。1标签可能有很多问题。因此,您可以使用数据模式来反映这种多对多关系。1:M:1.谢谢,我一定会记得给东西贴上更好的标签!当我开始有数百万个问题与所有这些相关联的标签时,数据库会非常大吗?这有关系吗?好吧,每个标记在标记表中只会出现一次,这样做既小又高效。每个主题的标记只包含整数(ID)字段,因此它将相对较小且速度相当快。适当的索引将完成其余的工作。它肯定会比存储冗余标记字符串更小更快。最后,数据库意味着高效地处理大量数据。这就是他们的目的。