【问题标题】:Best database schema for tagging system with a low and constant number tags用于标记系统的最佳数据库模式,具有低和恒定数量的标签
【发布时间】:2011-11-29 22:03:16
【问题描述】:
目前在标记系统中使用了三种流行的数据库模式。
通常最常推荐的方案是 Toxi 3 表多对多关系。
但是我遇到了一个特殊的需求,即标签的数量将被限制在不超过 100 个。这个数字将始终保持不变,并且不会将任何标签添加到数据库中。每个单独的项目可能有不超过 20 个标签。
在这种情况下,您会推荐什么架构,为什么?我第一次考虑使用完全非规范化的 MySQLicious 模式并使用 FULLTEXT / LIKE 进行搜索/过滤。
数据集本身可能永远不会超过 100,000。
【问题讨论】:
标签:
mysql
database
database-design
tagging
【解决方案1】:
在选择任何非规范化设计之前,您必须对要针对数据运行的查询有一个坚实的概念。非规范化设计以牺牲其他查询为代价,针对查询的某个子集进行优化。
例如,您需要搜索特定的标签吗?如果是这样,您需要一些方法来通过索引查找标签。不要使用LIKE '%word%' 查询来搜索子字符串;它将运行hundreds or thousands of times slower,而不是使用索引的查询。
您需要计算标签的出现次数吗?如果是这样,您需要一个限制重复的解决方案。您列出的唯一防止重复的设计是 Toxi。
我不会使用任何需要使用 MyISAM FULLTEXT 索引的解决方案。 MyISAM 太脆弱,容易受到数据损坏的影响。不要在 MyISAM 中存储您不准备定期从备份中重新生成或恢复的任何数据。
【解决方案2】:
如果您的标签确实是固定的并且永远不会被编辑,那么您可以只使用 2 个表格就可以了。您的主数据表,然后是一个将数据表中的记录与标签 ID 匹配的表。实际的标记值将存储在您的应用程序中(可能是一个常量)。这可能证明比额外的 JOIN 快一点,但明显不灵活,因为您需要更改应用程序代码以更改可用标签。
听起来您可能应该使用您讨论过的 3 表方法,因为即使您不使用它,也可能值得付出极小的性能折衷。另外,它可能没有将标签 ID 映射到应用程序代码中的标签值那么复杂。