需要有关“标签”表设计的建议

7se*_*seb 4 mysql innodb performance database-design maintenance

我的网站有不同的内容类型。所有内容类型都应该是可标记的(除非在模型中指定,无论如何)。我可以为我的设计想到 2 个选项:

2 个表选项:1 个标签表(+另一个,其 i18n 内容)加上 1 个关联表(content_type、content_id、tag_id)。

优点:

  • 创建速度更快
  • 标签的模型部分是相同的(所以继承模型)
  • 控制器也是一样。

潜在的缺点:

  • 性能会差吗?
  • 桌子很快会太大吗?
  • 如何查询标签云(与所有分组内容相关)?

许多表格选项:1 个标签表格,每种内容类型的关联表格。

优点:

  • 桌子会更短

缺点:

  • 必须自定义每个模型或编写逻辑/足迹来查询正确的表
  • 丑陋的长请求/php 代码来加入所有内容类型的标签


附加事实:

  • 前端将有缓存,标签由内容编写者设置。
  • 有 10 种内容类型。
  • 通常不会有新类型的内容。
  • 内容数量为 ~500 ,将在 3 年内翻倍。
  • MySQL 引擎 InnoDB。
  • 使用 yii 框架构建。
  • 将查询已定义内容类型的标签
  • 将查询任何类型内容的标签(例如,一个大标签云)。

所以我的想法是使用第一个设计(2 个表)。但我不是数据库专家......你会推荐第二种选择吗?为什么 ?

Fru*_*ner 5

我会选择选项 1(两张桌子)。

如果您只计划拥有 1000 个内容项(并且在 3 年内,而不是现在),我认为您不会有很多性能问题,除非每个内容项都标有十几个标签,其中大多数是该项目独有的。即便如此,我认为您不会看到太多的性能问题。如果每个内容类型都有 1 个标签表,然后您决定稍后添加/删除/更改内容类型,它还可以简化您的结构。

如果您真的不确定,您是否有时间/资源来构建两个示例数据库,一个基于每个结构,用您认为的实际负载填充它们(您可以编写脚本/程序来生成和插入测试数据,对吗?带有“无聊”的标签和内容,例如“content_1..content_2000 和 tag_1...tag_5000)并实际测试哪个表现更好?