我如何在数据库中实现标签?

时间:2015-03-05 20:04:48

标签: c# sql entity-framework-6

我有一个应用程序,我希望用户能够为文章添加标签(类似于堆栈溢出标签),但我希望它是动态的。到目前为止,我把它作为JSON字符串(不要太乱)但这有一个主要的缺点。首先,我将向您展示一个示例,然后解释我的问题。

说我有一篇文章,它在蜜蜂上,所以用户标记:蜜蜂,昆虫,蜂蜜,户外。

然后在我的文章课(实体框架)中我有

string AssosciatedTags { get; set; }

将保留:"[\"bees\", \"insect\",\"honey\"]"

然后当我渲染文章时,我只是在javascript中执行:

JSON.parse(model.AssosciatedTags); 

并尽我所能......轻松添加/删除标签。好吧,所以这里我没有真正想到的地方,现在我仍然相当困惑。我该如何实现排序机制?假设我的用户疯了。他们喜欢蜜蜂。他们可爱的黑色和黄色小条纹。因此,他们想要点击他们感兴趣的标签,我的服务器会返回那些标记了这些标签的文章。

但是怎么样?如果我有很多文章,将所有标记从JSON解析为数组似乎是一个坏主意,查找此标记并返回这些文章。

我的另一个考虑是简单地查找“,tagName”,这是非常肮脏的。

是否有标准方式或希望更优化的方式。

2 个答案:

答案 0 :(得分:3)

  

我的另一个考虑是简单地查找",tagName,"这很肮脏。

是的,那太肮了。这种技术有它的位置但不在这里。

将标记存储在具有架构int ArticleID, string TagName的另一个表中。这样,您可以索引TagName并有效地查询它。

这是标准解决方案。

如果您愿意,可以保留JSON字符串,但需要将其与存储标记的表保持同步。最好将其移除,或者非常小心。

答案 1 :(得分:1)

不要将您的代码存储为JSON。解析它们将对您的数据库造成巨大的影响。将它们分成自己的表。像这样:

articles <--- table of articles
tags <--- table of tags
articles_tags <--- join table that associates articles with tags

这被称为多对多关系。