PHP标签云

时间:2009-07-11 21:10:13

标签: php tags cloud

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

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

我在想

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。

的标签中选择*

这有缺陷吗?

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

固定为20个字符会占用表占用的空间量一点点开销,但它是一个如此小的表,无论如何我看不到稍大的文件大小是一个巨大的问题。

话虽如此,因为我认为在看到varchar(20)和char(20)之间存在差异之前,你需要大量的数据行,这是一个很小的事实。

只是一个想法。 :)

答案 3 :(得分:1)

我会使用单独的标签表:     TABLE标签:     tag_id- int(11),unique,auto_incremenet     tag - varchar(20)

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

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

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

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

答案 4 :(得分:1)

确保imageID字段上有索引。