用于标记多个源的数据库设计(MySQL)

时间:2011-06-08 13:02:35

标签: mysql database-design tags tagging

我正在开发一个项目,我有以下(编辑过的)表结构:( MySQL)

Blog
    id
    title
    description

Episode
    id
    title
    description

Tag
    id 
    text 

这个想法是,标签可以应用于任何博客或剧集(以及其他类型的源),如果用户已经在标签表中不存在新标签,则可以创建新标签。

标签的目的是用户可以搜索网站,结果将搜索网站上所有类型的材料。此外,在每篇博客文章/剧集描述的底部,它将包含该项目的标签列表。

我对搜索机制的考虑太多了,但我想在OR和AND搜索之间是灵活的,如果这对选择有任何影响,并且可能允许用户过滤特定类型的搜索结果源。

最初我打算创建多个标签映射表:

BlogTag
    id
    tag_id
    blog_id

EpisodeTag
    id
    episode_id
    tag_id

但现在我想知道我是否会更好:

TaggedStuff
    id
    source_type
    source_id
    tag_id

其中source_type是一个整数,与是否是Episode,Blog或其他类型相关,我没有包含在上面的结构中,而source_id将是该特定表中的引用。

我只是想知道最佳结构是什么,第一选择还是第二种?

3 个答案:

答案 0 :(得分:1)

结构2的最大损失是referential integrity的损失。如果你可以对此说“不管”,那么采用这种结构可能会更容易。

当我说结构2时,我的意思是:

  

TaggedStuff

id
source_type
source_id
tag_id

答案 1 :(得分:1)

在干净(学术)设计中,您经常会看到ResourceBlog的超类型Episode(或类似内容)与其自己的表格。另一个标签表。由于它是TagResource之间的N:M关系,因此它们之间有一个额外的映射表。

因此,在这样的设计中,您可以通过与其泛化关系将标记实体与您的资源相关联。

simplified ER-Diagram

之后,您可以将常规属性置于泛化中。 (即标题,描述) 您可以为TagResource之间的关系添加属性,例如计数器使用特定标记标记特定资源的频率。或者标签的使用频率和(和你在右上角的stackoverflow上看到的东西)

答案 2 :(得分:0)

如果我理解正确,重点是优化搜索机制...... 因此,有必要制作某种index_table并使那里的数据士气低落......

我的意思是这样的smth: 网址,类型,标题,Search_Field等。 其中Url是文章或剧集的路径,Type(文章|剧集),Name(用户将看到的内容),Search_Field(标签列表,其他搜索重要数据)

这就是为什么两种变体都非常好)))