我正在开发一个项目,我有以下(编辑过的)表结构:( 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将是该特定表中的引用。
我只是想知道最佳结构是什么,第一选择还是第二种?
答案 0 :(得分:1)
结构2的最大损失是referential integrity的损失。如果你可以对此说“不管”,那么采用这种结构可能会更容易。
当我说结构2时,我的意思是:
TaggedStuff
id source_type source_id tag_id
答案 1 :(得分:1)
在干净(学术)设计中,您经常会看到Resource
和Blog
的超类型Episode
(或类似内容)与其自己的表格。另一个标签表。由于它是Tag
和Resource
之间的N:M关系,因此它们之间有一个额外的映射表。
因此,在这样的设计中,您可以通过与其泛化关系将标记实体与您的资源相关联。
之后,您可以将常规属性置于泛化中。 (即标题,描述)
您可以为Tag
和Resource
之间的关系添加属性,例如计数器使用特定标记标记特定资源的频率。或者标签的使用频率和(和你在右上角的stackoverflow上看到的东西)
答案 2 :(得分:0)
如果我理解正确,重点是优化搜索机制...... 因此,有必要制作某种index_table并使那里的数据士气低落......
我的意思是这样的smth: 网址,类型,标题,Search_Field等。 其中Url是文章或剧集的路径,Type(文章|剧集),Name(用户将看到的内容),Search_Field(标签列表,其他搜索重要数据)
这就是为什么两种变体都非常好)))