我正在寻求数据库方案的帮助,而不是实际的“云”本身。
在用户提交图像并可以标记图像的网站中,如何设置数据库以获得最佳性能?
我在想
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。
的标签中选择*这有缺陷吗?
答案 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字段上有索引。