标记系统的最佳数据库模式,具有低和常数标记

时间:2011-11-29 22:03:17

标签: mysql database database-design tagging

目前在标记系统中使用了三种流行的数据库模式。

  • MySQLicious
  • 天窗
  • TOXI

一般来说,最常推荐的方案是Toxi 3表多对多关系。

但是我遇到了一个特殊的需求,其中标签的数量将被限制为不超过100.这个数字将始终是恒定的,没有标签被添加到数据库中。每个单独的项目可能不会超过20个标签。

在这种情况下,您会推荐哪种架构?为什么?我有史以来第一次考虑使用完全非规范化的MySQLicious架构并使用FULLTEXT / LIKE进行搜索/过滤。

数据集本身可能永远不会超过100,000。

2 个答案:

答案 0 :(得分:6)

在选择任何非规范化设计之前,必须对您要针对数据运行的查询有充分的了解。非规范化设计针对某些查询子集进行优化,但代价是其他查询。

例如,您是否需要搜索特定标签?如果是这样,您需要某种方式通过索引查找标记。不要使用LIKE '%word%'个查询来搜索子字符串;它将运行hundreds or thousands of times slower而不是使用索引的查询。

您需要计算标签的出现次数吗?如果是这样,您需要一个限制重复的解决方案。您列出的唯一可以防止重复的设计是Toxi。

我不会使用任何需要使用MyISAM FULLTEXT索引的解决方案。 MyISAM太脆弱,容易受到数据损坏。不要在MyISAM中存储任何您不准备从备份中重新生成或恢复的数据。

答案 1 :(得分:0)

如果您的代码确实已修复且永远不会被修改,那么可以只使用2个表格。您的主数据表,然后是一个表,它将数据表中的记录与标记ID进行匹配。实际的标记值将存储在您的应用程序中(可能是常量)。此可能证明比其他JOIN快一点,但由于您需要更改应用程序代码以更改可用标记,因此具有明显的不灵活性。

听起来你可能应该采用你所讨论的3表方法作为灵活性,即使你不使用它,也可能值得极小的性能折衷。此外,它可能不如将标记ID映射到应用程序代码中的标记值那么复杂。