【问题标题】:Pictures & Tags - Database Design Question图片和标签 - 数据库设计问题
【发布时间】:2010-08-01 01:58:56
【问题描述】:

我有 3 个表格,可以让我获取某张图片的所有标签,或所有带有特定标签的图片。

我还想知道每个标签存在的次数。我如何使用 MySQL 获取这些信息?

是否值得在Tags 表中添加一个“计数”列来保存此信息?

文件表

File ID    File Name    ...
-------    ---------
   1         a.jpg      ...
   2         b.png      ...
   3         c.jpg      ...
   .           .
   .           .
   .           .

标签表

Tag Name    Tag Creator     ...
--------    -----------  
 David        david         ...
 2010         julia         ...
   .            .
   .            .
   .            .

FilesTags 表

File ID    Tag Name
-------    --------  
   1        2010
   1        April
   1        David
   2        2010
   2        Julia
   3        Friends
   .          .
   .          .
   .          .

【问题讨论】:

  • 您可能会遇到问题,使用 TAGS 主键的自然键。基于字符串的键较慢,因为在 MySQL 中 VARCHAR(4) 与 INT 的空间相同 - 在此之上,您使用的空间比 INT 更多。另外,如果您想更改标记名值 - 您将不得不更新 FilesTags 表中的所有支持引用。
  • @OMG Ponies:这就是具有级联更新的外键的用途(但 Oracle 不支持)。此外,使用自然主键还有一些好处:您不必进行额外的连接来获取标签字符串。

标签: mysql database database-design


【解决方案1】:
SELECT FilesTags.Tag_name, COUNT(*) as number_of_occurences
FROM FilesTags
GROUP BY FilesTags.Tag_name;

【讨论】:

    【解决方案2】:

    Zaki's response 回答了您的一个问题,但没有回答另一个问题。

    “是否值得添加一个“计数”列 到标签表来保存这个信息?”

    这真的取决于你要对计数做什么。这又取决于您网站的性质。

    SO 会在标签旁边显示计数;这部分是因为它的目标受众是极客和像数字一样的极客。但在标记问题时,计数也是有用的信息。此外,还需要考虑分类学家的徽章,以及在版主页面上显示新标签。换句话说,有很多关于计数的调用,因此保持和维护每个标签的计数是有意义的。

    其他网站从其标签中提取的汁液几乎没有。但是,例如,假设您要显示tag cloud;您可能希望避免在每次渲染时计算FileTags 中的所有条目。保持计数会有所帮助。

    但请记住,写入可能很昂贵。因此,在决定存储计数之前,请清楚地了解您将如何处理这些计数。异步维护它们,也许是在一个批处理作业中,将是一个好主意。

    【讨论】:

    • +1 用于解释何时有“计数”列。最重要的是它取决于。
    • @Zaki - 大多数设计决策的底线是“这取决于* :)
    【解决方案3】:

    要查找标签“ABC”出现的次数,只需这样做

    SELECT COUNT(*) FROM FilesTags Table WHERE Tag Name = "ABC";

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多