存储Stack Overflow等标签或类别的最佳方式

时间:2011-11-07 19:31:33

标签: database-design

我有一个问题网络应用程序,允许用户询问有关具体事项的问题。我正在为每个问题开发一个标签样式标签,就像堆栈溢出一样。当我将每个帖子与类别或标签相关联时,我想知道存储它的最佳方式是什么。以下是我认为这样做的理想方法:

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

我觉得使用这种方法很难根据特定标签搜索问题,因为它必须解析每个问题的类别列,这似乎不太理想。构建此功能以适应搜索的好方法是什么,同时保持模式非常简单(请记住,我的主要目标是使标记尽可能与stackoverflow类似)?

4 个答案:

答案 0 :(得分:7)

嗯,为了保持简单,为什么不遵循三个表的规范化方法:

有问题(QId,姓名)

标签(tagId,名称)

每个主题标签(QId,tagId)

非常简单....

答案 1 :(得分:1)

最好的方法是使用外键。

有一个表存储带有唯一ID的问题/项目。 (item_ID,info1,info2,info3 ......)

有另一个表存储所有可能的标签及其唯一ID。 (tag_ID,tag_name)

最后一张桌子将两者连在一起。 (ITEM_ID,TAG_ID)

答案 2 :(得分:1)

只是一个简单的many-to-many关系?

例如:

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

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

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

然后将它们与foreign key constraints

链接在一起

答案 3 :(得分:0)

每个帖子在某个表格中都有一个ID,包含您计划包含的内容。我们称之为'发布'。

每个帖子标记都在另一个包含post_id和标记的表格中(以及您可能喜欢的任何审核列)' post_tags'。

作为管理员,您可以(可选)将记录添加到“标记”中。查找表格中的标签很受欢迎,您可以很好地定义它们,la https://stackoverflow.com/tags/asp.net/info