我想构建一个查询,在数据库表中插入照片详细信息。下面是我的表格结构:
photos(photo_id, photo_title, caption, ....)
tags(tag_id, tag_name)
tag_asc(tag_id, photo_id)
照片有标题、说明和标签数组。我想:
- 在照片表中插入photo_title和标题
- 在标签表中插入标签数组中的每个标签。
- 在tag_asc表中插入tag_id和photo_id(链接带有照片的标签)。
我已经提出了以下三个查询来完成上述任务。
mysql_query("INSERT INTO photos (photo_title, caption)
VALUES ($title, $caption)");
$photo_id = mysql_insert_id(); //get photo_id
foreach ($tags as $tag){
mysql_query("INSERT INTO tags (tag_name)
VALUES ($tag)");
$tag_id = mysql_insert_id(); //get tag_id
mysql_query("INSERT INTO tag_asc (tag_id, photo_id)
VALUES ($tag_id, $photo_id)");
}
我的问题
如果上面的方法是好的,或者是否有更有效的方法来做同样的事情?
你做的大部分事情看起来都很好。我看到的主要问题是潜在的重复标签。
最好检查标签是否存在,如果存在则获取现有标签的ID,而不是每次都创建一个新标签。这将防止重复的标记名插入到tags
表中。如果你知道每个标签都是唯一的,这可以加快以后的事情——例如,你可以通过他们的标签id搜索照片,而不必做一些混乱的JOIN
的东西。
- 给
tags.tag_name
一个唯一的索引,如果没有一个。 - 使用以下函数获取标签ID。如果标记已经存在,则返回现有的行ID。如果没有,将创建一个新行并返回其ID。
function select_or_create_tag($tag_name) {
$tag_name = addslashes($tag_name);
$result = mysql_query("SELECT id FROM tags WHERE tag_name='$tag_name'");
if ( mysql_num_rows($result) > 0 )
return mysql_result($result, 0, 0);
$insert = mysql_query("INSERT INTO tags (tag_name) VALUES ('$tag_name')");
return mysql_insert_id($insert);
}
基于您的代码的示例用法:
mysql_query("INSERT INTO photos (photo_title, caption)
VALUES ($title, $caption)");
$photo_id = mysql_insert_id();
foreach ( $tags as $tag ) {
$tag_id = select_or_create_tag($tag);
mysql_query("INSERT INTO tag_asc (tag_id, photo_id)
VALUES ($tag_id, $photo_id)");
}
也
:
- 确保在
tag_asc.tag_id
和tag_asc.photo_id
上设置了非唯一索引,以便更快地查询。 正如OMG Ponies所提到的,将这些代码转换为存储SQL过程可能是值得的。这将摆脱大量的开销涉及使所有这些SQL查询单独。