2011-10-28 41 views
2

我有一個表tags2與字段tag_idname。我有一個連接表tag_map,連接表tags2到表video(通過vid_id)的字段tag_idvid_id插入數據到多對多

當我插入一個新的標籤爲vid_id,我刪除了所有條目tag_mapvid_id,如果有隻有一個tag_maptag_id進入,我也刪除標籤表tags2防止鬼項(標記沒有對應的tag_map條目的條目)。

然後,我在插入時檢查每個標記以檢查tags2表中是否存在該標記。如果是這樣,我得到它的tag_id,我插入tag_map表中的條目。如果它不插入到兩個表中。 有沒有更好的方法來做到這一點?一個人提到,我應該在tags2tag_map上都有外鍵,但我仍然不知道如何檢查標記是否存在於表tags2中,因此我可以得到它的tag_id,並將其與輸入tag_map

foreach($variable as $tag) { 

    $sql = 'SELECT *, COUNT(tags2.name) as cnt 
FROM tag_map 
JOIN tags2 ON tags2.tag_id = tag_map.tag_id 
JOIN video ON video.vid_id = tag_map.vid_id 
WHERE tags2.name=?'; 
$stmt_tags2 = $conn->prepare($sql); 
$result=$stmt_tags2->execute(array($tag)); 
while ($row = $stmt_tags2->fetch(PDO::FETCH_ASSOC)) { 
    $cnt=$row['cnt']; 
    $exist_tag_id=$row['tag_id']; 
} 

$id=md5(uniqid()); 
$tag_id=md5(uniqid()); 

if ($cnt==0){ 
    $sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)"; 
$stmt16 = $conn->prepare($sql); 
$result=$stmt16->execute(array($id,$vid_id,$tag_id)); 
    $sql="INSERT into tags2 (tag_id,name) VALUES (?,?)"; 
$stmt16 = $conn->prepare($sql); 
$result=$stmt16->execute(array($tag_id,trim($tag))); 
} 
else { 
$sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)"; 
$stmt16 = $conn->prepare($sql); 
$result=$stmt16->execute(array($id,$vid_id,$exist_tag_id)); 
} 

} 

回答

1

嗨,讓我試試並阻止你,只是告訴你如何製作一個非常好的標籤數據庫模型。看起來你幾乎在那裏,但只需要一個小手。

表。 標籤 TAG_ID(小學) 名(VARCHAR) 狀態TINYINT

Tag_rel TAG_ID(小學) OBJECT_TYPE(小學) OBJECT_ID(小學) 狀態TINYINT (添加索引OBJECT_TYPE,OBJECT_ID)

好的如此標籤表存儲您的標籤 - 你已經有了這個。 Tags_rel將您的標籤存儲到視頻關係中。你會注意到我已經使用了object_type和object_id,因爲當你接下來要說照片object_type = 1可以是視頻而object_type = 2可以是照片等等。

現在爲您的僞代碼。

後標籤 UPDATE tag_rel SET狀態= 0其中OBJECT_TYPE = x和OBJECT_ID = Y

-normally爆炸

每個標籤{ 沒有標籤在標籤存在表 沒有 - 插入並獲得ID 是 - 獲取ID。 UPDATE tag_rel將狀態設置= 1,其中OBJECT_TYPE = x和OBJECT_ID = y和TAG_ID = ID }

是啊,那將是我做的最好的方式,我認爲幾乎是一個行業標準,這個查詢有點不確定。

SELECT *,COUNT(tags2.name)作爲CNT FROM tag_map JOIN tags2 ON tags2.tag_id = tag_map.tag_id JOIN視頻ON video.vid_id = tag_map.vid_id WHERE tags2.name =?

我希望我在這裏幫了忙。 Richard

+0

所以基本上你說我應該保持我插入的方式,但修改我的tag_map表有一個更靈活的狀態字段?一位數據庫專家說,我應該在tag_id字段中添加外鍵,但不再幫助我,所以我不確定這一點。對此有何想法?謝謝你的時間理查德。 – Scarface