2009-07-11 91 views
1

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

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

我想

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); 

然后检索,我会选择从标签,其中图像标识= $ imagID *。

这是否有缺陷?

回答

3

您应该在两个表格之间有一个HABTM关系(一个用于标签,第三个表格包含图像ID和标签ID)。这样您就不会限制图像可以具有的标签数量或标签可以属于的图像数量,也不会有重复。

+0

我最终这样做。主要是因为我觉得这是SoF的做法,可以让我为该表添加额外的列,比如哪个用户首先创建了该标签等。 – sqram 2009-07-12 00:50:44

3

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

我认为一个很小的优化就是列的顺序。把'int'分组在一起,因为它们是MySQL的固定宽度,这意味着它们可以以比int varchar int更高的顺序进行搜索。

1

我会用一个单独的标签表: 表标签: tag_id- INT(11),独特的,auto_incremenet 标签 - VARCHAR(20)

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

然后,我会抬头,如果标签INSERT INTO标记(标记,图像ID)VALUES('$ tag_id [0]',$ imageID);已经存在并且将只插入标记。 INSERT INTO tags(tag,imageID)VALUES('$ tag_id [1]',$ imageID); INSERT INTO tags(tag,imageID)VALUES('$ tag_id [2]',$ imageID);

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

1

确保imageID字段上有一个索引。

2

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

被固定为20个字符会导致表中占用的空间量有点小开销,但无论如何它是一个如此小的表,我看不到稍大的文件大小是个大问题。如上所述,事实上是一张小桌子,我想在你看到varchar(20)和char(20)之间的区别之前,你需要很多行数据。

只是一个想法。 :)