【问题标题】:PHP Tag CloudPHP 标签云
【发布时间】:2009-07-11 21:10:12
【问题描述】:

我正在寻求有关数据库方案的帮助,而不是实际的“云”本身。

在用户提交图像并可以标记图像的站点中,应如何设置数据库以获得最佳性能?

我在想

ID - int(11), unique, auto_incremenet
tag - varchar(20)
imageID - int(11)

假设我上传了一张图片,并将其标记为“多伦多,寿司,夏天”。

查询将是:

INSERT INTO tags (tag, imageID) VALUES ('$tag[0]', $imageID);
INSERT INTO tags (tag, imageID) VALUES ('$tag[1]', $imageID);
INSERT INTO tags (tag, imageID) VALUES ('$tag[2]', $imageID);

然后要检索,我会从其中 imageID = $imagID 的标签中选择 *。

这有缺陷吗?

【问题讨论】:

    标签: php tags cloud


    【解决方案1】:

    您应该在两张表之间建立 HABTM(拥有和属于许多)关系,一张用于图像,一张用于标签,第三张表包含图像 ID 和标签 ID 的组合。这样,您就不会限制图像可以具有的标签数量或标签可以属于的图像数量,并且您没有重复。

    【讨论】:

    • 我最终这样做了。主要是因为我觉得 SoF 也是这样做的,这可以让我向该表添加额外的列,例如哪个用户首先创建了该标签等。
    【解决方案2】:

    除了共享相同标签的图像在数据库中有重复条目之外,我没有看到这种方法有任何实际问题。但是,如果您尝试进行规范化,最终会得到一个包含对另一个包含标签本身的表的重复引用的表,在这种情况下,这似乎是在浪费时间(为 MySQL 编码、连接和遍历表)。

    我会考虑的一个小优化是列的顺序。将 'int' 组合在一起,因为它们是 MySQL 的固定宽度,这意味着按该顺序搜索它们的速度比 int varchar int 略快。

    【讨论】:

      【解决方案3】:

      将标签字段更改为 char(20) 也会提高性能吗?整个表将变为固定宽度,并且在固定宽度表上运行的查询通常更快 - 所以我相信我最近对数据库设计的研究。

      固定为 20 个字符会在表格占用的空间量方面产生一点开销,但无论如何它是如此之小,我看不出稍微大一点的文件大小是个大问题。

      话虽如此,事实上是一个很小的表,我想你需要很多行数据才能看到 varchar(20) 和 char(20) 之间的区别。

      只是一个想法。 :)

      【讨论】:

        【解决方案4】:

        我会使用一个单独的标签表: 表标签: tag_id- int(11), 唯一, auto_incremenet 标签 - varchar(20)

        TABLE image tags:
        ID - int(11), unique, auto_incremenet
        tag - varchar(20)
        imageID - int(11)
        

        然后我会查找标签是否已经存在并仅插入 ID

        插入标签 (tag, imageID) VALUES ('$tag_id[0]', $imageID); 插入标签 (tag, imageID) VALUES ('$tag_id[1]', $imageID); INSERT INTO tags (tag, imageID) VALUES ('$tag_id[2]', $imageID);

        通过这种方式,具有相同标签的图像将更容易找到,因为它们共享相同的 tag_id 而不仅仅是相同的 varchar 内容。 当然你应该将标签转换为小写并替换特殊字符等。

        【讨论】:

          【解决方案5】:

          确保 imageID 字段上有索引。

          【讨论】:

            猜你喜欢
            • 2010-12-31
            • 1970-01-01
            • 1970-01-01
            • 2019-06-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多