我目前正在开发一个系统,该系统将使我们的网站可以使用标签,并且在如何最好地和最有效地存储数据库中的标签方面遇到了一些问题。设计需要设置得相对简单,以便检索与搜索词匹配的帖子(类似于Twitter,当您单击标签链接时,它会显示所有带有该标签的推文)。
标签将通过从已创建帖子的内容中提取术语并插入它们来存储在数据库中(也可与Twitter相比较)。如何插入它们当然是手头的问题:
目前我在两种可能的设计之间犹豫:
1)我的第一个设计想法(可能更传统)是一个三表设计:
- 第一张表只是存储帖子内容和其他相关数据的表(我已经在使用这样的表)。 - 第二张表只是存储正在使用的新标签,基本上作为已使用的所有标签的查找表。 - 第三个表是定义标签和帖子之间关系的表。所以基本上,它将是一个简单的表,其中将具有帖子ID的一列和我们在前一个表中存储的单个标签的ID的另一列。因此,例如有3个标签的帖子将在此表中有3行,每个标签都有一个关联。
2)第二个设计是两个表的设计:
- 与上面相同的存储帖子数据的表。 - 第二个表是第一种设计中第二个和第三个表的混合体:它保存标签和帖子之间关系的数据,但是它不会将新标签存储在一个表中并为其分配ID,而是直接存储实际的标签(例如“#test”)本身以及帖子的ID。同样的概念也适用于此处,如果帖子中有3个标签,则会在表中存储3行。
我在这些想法之间犹豫,因为第一种选择似乎是更标准的方法,并且看起来更加“结构化”。然而,由于它们是标签,我认为实际上没有必要为每个标签分配唯一的ID,因为标签不像类别或流派等真正的分类。
此外,当我尝试为标签制作搜索页面时,我需要使用较少的JOIN,因为我不需要查找搜索词的ID,然后转到另一个表并查找与该ID相关联的帖子。
此外,当尝试简单列出帖子的标签时,可能会有一件有点烦人的事情,那就是标签可能会以不同于用户在其帖子中设计的样式打印出来。例如,如果用户添加了#testing,但另一个用户之前已输入了一个带有#TeStIng的帖子,则帖子的标签将打印出#TeStIng,因为它在数据库查找表中保存的方式就是这样。当然,您可以使其区分大小写,但在搜索中#testing和#TeStIng应被视为相同的标签,因此可能会变得混乱。或者我对此有误吗?有没有人对如何避免这种情况有建议?
另一方面,我对第二个表格设计的担忧是,如果表格变得非常大,那么它可能会变得效率低下,因为查找字符串比搜索整数要慢(我将使用第一个设计进行整数搜索)。然而,由于我必须在第一个设计中使用更多的JOIN,因此是否会有性能差异?仅仅为了明确,当搜索字符串本身时,我将使用=运算符而不是LIKE。
同样,我想象第一个设计在查询标签本身时更有效,例如有多少帖子正在使用某个标签等等,虽然使用第二个设计也不是很困难,但我再次关心效率。
有什么想法可能更好?最重要的是,通过标签进行搜索是有效的,因此例如我正在尝试查找与#test相关联的帖子。理想情况下,我还想能够从数据库中检索帖子的标签,因为它是由用户在帖子内容中设计的样式。在这一点上,所有其他围绕分析标签的查询和功能都是次要的。
标签将通过从已创建帖子的内容中提取术语并插入它们来存储在数据库中(也可与Twitter相比较)。如何插入它们当然是手头的问题:
目前我在两种可能的设计之间犹豫:
1)我的第一个设计想法(可能更传统)是一个三表设计:
- 第一张表只是存储帖子内容和其他相关数据的表(我已经在使用这样的表)。 - 第二张表只是存储正在使用的新标签,基本上作为已使用的所有标签的查找表。 - 第三个表是定义标签和帖子之间关系的表。所以基本上,它将是一个简单的表,其中将具有帖子ID的一列和我们在前一个表中存储的单个标签的ID的另一列。因此,例如有3个标签的帖子将在此表中有3行,每个标签都有一个关联。
2)第二个设计是两个表的设计:
- 与上面相同的存储帖子数据的表。 - 第二个表是第一种设计中第二个和第三个表的混合体:它保存标签和帖子之间关系的数据,但是它不会将新标签存储在一个表中并为其分配ID,而是直接存储实际的标签(例如“#test”)本身以及帖子的ID。同样的概念也适用于此处,如果帖子中有3个标签,则会在表中存储3行。
我在这些想法之间犹豫,因为第一种选择似乎是更标准的方法,并且看起来更加“结构化”。然而,由于它们是标签,我认为实际上没有必要为每个标签分配唯一的ID,因为标签不像类别或流派等真正的分类。
此外,当我尝试为标签制作搜索页面时,我需要使用较少的JOIN,因为我不需要查找搜索词的ID,然后转到另一个表并查找与该ID相关联的帖子。
此外,当尝试简单列出帖子的标签时,可能会有一件有点烦人的事情,那就是标签可能会以不同于用户在其帖子中设计的样式打印出来。例如,如果用户添加了#testing,但另一个用户之前已输入了一个带有#TeStIng的帖子,则帖子的标签将打印出#TeStIng,因为它在数据库查找表中保存的方式就是这样。当然,您可以使其区分大小写,但在搜索中#testing和#TeStIng应被视为相同的标签,因此可能会变得混乱。或者我对此有误吗?有没有人对如何避免这种情况有建议?
另一方面,我对第二个表格设计的担忧是,如果表格变得非常大,那么它可能会变得效率低下,因为查找字符串比搜索整数要慢(我将使用第一个设计进行整数搜索)。然而,由于我必须在第一个设计中使用更多的JOIN,因此是否会有性能差异?仅仅为了明确,当搜索字符串本身时,我将使用=运算符而不是LIKE。
同样,我想象第一个设计在查询标签本身时更有效,例如有多少帖子正在使用某个标签等等,虽然使用第二个设计也不是很困难,但我再次关心效率。
有什么想法可能更好?最重要的是,通过标签进行搜索是有效的,因此例如我正在尝试查找与#test相关联的帖子。理想情况下,我还想能够从数据库中检索帖子的标签,因为它是由用户在帖子内容中设计的样式。在这一点上,所有其他围绕分析标签的查询和功能都是次要的。