的MySQL架构和CRUD查询让我们想象一下,我有视频,每个视频可以有一些标签(最高为每10个视频标签)。的标签系统
我计划我的SQL模式,它看起来像这样:
videos
:id
,title
,path
,tag_rels
:id
,tag_id
,item_id
(它将指向videos
id
。),tags
:id
,tag
;
好吧,对我来说很好。
然后我写了SELECT
应该得到视频,加上标签。
SELECT `videos`.`id`, `videos`.`title`, `videos`.`path`, `tags`.`tag`
FROM `videos`
JOIN `tag_rels`
ON `tag_rels`.`item_id` = `videos`.`id`
JOIN `tags`
ON `tags`.`id` = `tag_rels`.`tag_id`
它没有经过测试,因为它都在心灵层面。
而大问题是INSERT
查询(我猜)。
虽然我明白:
- 查询#1:
videos
插入视频。这将返回主键(videos
。id
),对不对? - 查询#2:从数据库中选择标签#1,并得到它的主键, #3
- 查询:如果没有这样的记录(基于标签名(
tags
tag
),执行插入查询和插入。它的目标是让该标记的主键, - 查询4:插入与
tag_rels
项视频的PK和标签的PK;
所以,这是每个视频一个查询,因为它是,加上2或3查询每个标签。
这意味着如果视频有10个标签和(最坏的情况),那么这些标签中的任何一个都不会被保存在数据库中,这将花费我1 + 10 * 3 ... em .... 31查询?!
有必须是一个更好的办法!非常感谢!
P.S.我不想在数据库中出现重复条目,并且我希望列中有used_in
到tags
以及使用该标记的视频数量。在未来...
你能给(new_video_id是Video.id你插入一条记录到视频后得到)我是一个例子吗?我不知道程序是如何工作的 - 以前从未使用过。或者,至少有一些链接... – daGrevis
以下是文档:http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html –