PHP标记云

PHP标记云,php,tags,cloud,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 INT

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

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

我在想

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


这有缺陷吗?

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

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

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


我认为,一个微小的优化是列的顺序。将“int”分组在一起,因为它们对于MySQL是固定宽度的,这意味着它们可以以比int varchar int更快的顺序进行搜索。

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


我认为,一个微小的优化是列的顺序。将“int”分组在一起,因为它们是MySQL的固定宽度,这意味着按照该顺序搜索它们的速度比int varchar int要快一些。

我将使用一个单独的标记表: 表标记: 标记id-int(11),唯一,自动递增 标签-varchar(20)

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

插入标签(标签,图像id)值(“$tag_id[0]”,$imageID); 插入标签(标签,图像id)值(“$tag_id[1]”,$imageID); 插入标签(标签,图像id)值(“$tag_id[2]”,$imageID)

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

我将使用单独的标记表: 表标记: 标记id-int(11),唯一,自动递增 标签-varchar(20)

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

插入标签(标签,图像id)值(“$tag_id[0]”,$imageID); 插入标签(标签,图像id)值(“$tag_id[1]”,$imageID); 插入标签(标签,图像id)值(“$tag_id[2]”,$imageID)

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

确保imageID字段上有索引

确保imageID字段上有索引

将标记字段更改为字符(20)是否也会提高性能?整个表将变为固定宽度,在固定宽度表上运行的查询通常更快——因此我相信我最近对DB设计的研究

固定为20个字符将导致表占用的空间量方面的一些开销,但它是一个如此小的表,无论如何,我看不出稍微大一点的文件大小是一个大问题

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


只是一个想法。:)

将标记字段更改为字符(20)是否也会提高性能?整个表将变为固定宽度,在固定宽度表上运行的查询通常更快——因此我相信我最近对DB设计的研究

固定为20个字符将导致表占用的空间量方面的一些开销,但它是一个如此小的表,无论如何,我看不出稍微大一点的文件大小是一个大问题

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


只是一个想法。:)

最后我做了这个。主要是因为我觉得这也是SoF做这件事的方式,这可以让我向表中添加额外的列,比如哪个用户首先创建了标签,等等。最后我这样做了。主要是因为我觉得SoF也是这样做的,这可以让我向表中添加额外的列,比如哪个用户首先创建了标签,等等。
TABLE image tags:
ID - int(11), unique, auto_incremenet
tag - varchar(20)
imageID - int(11)