1

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

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

我刚在想

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 的标签中选择 *。

这有缺陷吗?

4

5 回答 5

3

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

于 2009-07-11T21:21:44.127 回答
3

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

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

于 2009-07-11T21:22:36.247 回答
2

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

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

话虽如此,事实上是一个很小的表,我想在看到 varchar(20) 和 char(20) 之间的区别之前,您需要大量的数据行。

只是一个想法。:)

于 2009-07-12T16:08:08.057 回答
1

我会使用一个单独的标签表:TABLE tags: 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 tags (tag, imageID) 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 内容。当然,您应该将标签转换为小写并替换特殊字符等。

于 2009-07-11T21:24:07.570 回答
1

确保 imageID 字段上有索引。

于 2009-07-11T21:29:12.240 回答