2011-11-08 134 views
0

的MySQL架構和CRUD查詢讓我們想象一下,我有視頻,每個視頻可以有一些標籤(最高爲每10個視頻標籤)。的標籤系統

我計劃我的SQL模式,它看起來像這樣:

  • videosidtitlepath
  • tag_relsidtag_iditem_id(它將指向videosid。),
  • tagsidtag;

好吧,對我來說很好。

然後我寫了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插入視頻。這將返回主鍵(videosid),對不對?
  • 查詢#2:從數據庫中選擇標籤#1,並得到它的主鍵,
  • #3
  • 查詢:如果沒有這樣的記錄(基於標籤名(tagstag),執行插入查詢和插入。它的目標是讓該標記的主鍵,
  • 查詢4:插入與tag_rels項視頻的PK和標籤的PK;

所以,這是每個視頻一個查詢,因爲它是,加上2或3查詢每個標籤。

這意味着如果視頻有10個標籤和(最壞的情況),那麼這些標籤中的任何一個都不會被保存在數據庫中,這將花費我1 + 10 * 3 ... em .... 31查詢?!

有必須是一個更好的辦法!非常感謝!

P.S.我不想在數據庫中出現重複條目​​,並且我希望列中有used_intags以及使用該標記的視頻數量。在未來...

回答

2

這看起來對於存儲過程類似的情況。讓商店製作視頻數據和標籤列表。然後在裏面執行查詢#1到#4。由於您不必前後移動數據,因此速度會更快。

這裏是那種你需要什麼。這只是一個起點,所以不要指望它的編譯運行正常,而且你需要全部10個標記(我不認爲mysql可以使用數組,但有人可能會更好)。

CREATE PROCEDURE insertvideo (IN videotitle CHAR(20),IN videopath CHAR(20), IN tag1 CHAR(20),IN tag2 CHAR(20), IN tag3 CHAR(20) ) 
    BEGIN 
     DECLARE myid INT; 
     DECLARE tagid INT; 
     INSERT INTO videos (title, path) VALUES (videotitle,videopath); 
     SELECT id INTO myid FROM videos WHERE title=videotitle AND path=videopath; 
     SET tagid=NULL; 
     SELECT id INTO tagid FROM tags WHERE tag=tag1; 
     IF tagid IS NULL THEN 
     INSERT INTO tags (tag) VALUES (tag1); 
     SELECT id INTO tagid FROM tags WHERE tag=tag1; 
     END IF; 
     INSERT INTO tag_rels (tag_id, item_id) VALUES (tagid,myid); 
     SET tagid=NULL; 
     SELECT id INTO tagid FROM tags WHERE tag=tag2; 
     IF tagid IS NULL THEN 
     INSERT INTO tags (tag) VALUES (tag1); 
     SELECT id INTO tagid FROM tags WHERE tag=tag2; 
     END IF; 
     INSERT INTO tag_rels (tag_id, item_id) VALUES (tagid,myid); 
     SET tagid=NULL; 
     SELECT id INTO tagid FROM tags WHERE tag=tag3; 
     IF tagid IS NULL THEN 
     INSERT INTO tags (tag) VALUES (tag1); 
     SELECT id INTO tagid FROM tags WHERE tag=tag3; 
     END IF; 
     INSERT INTO tag_rels (tag_id, item_id) VALUES (tagid,myid); 
    END 
+0

你能給(new_video_id是Video.id你插入一條記錄到視頻後得到)我是一個例子嗎?我不知道程序是如何工作的 - 以前從未使用過。或者,至少有一些鏈接... – daGrevis

+0

以下是文檔:http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html –

1

我想你的計算是錯誤的。無論標籤編號如何,您都需要執行3個查詢。
1. INSERT INTO Video ...
2. INSERT INTO tags(tag)
SELECT * FROM
(SELECT 'tag_1' as tag UNION SELECT 'tag_2' ...)a WHERE NOT EXISTS (SELECT 1 FROM tags b WHERE b.tag = a.tag)

3.Assuming你有(TAG_ID,ITEM_ID),INSERT IGNORE INTO tag_rels(tag_id, item_id) SELECT tag_id, new_video_id FROM tags WHERE tags.tag IN ([new tag_list])唯一索引 -