2011-10-28 19 views
2

フィールドtag_idnameのテーブルtags2があります。テーブルtags2をテーブルvideo(vid_id経由)に接続するフィールドtag_idvid_idの接合テーブルtag_mapがあります。多数のデータを挿入する

私はvid_idのための新しいタグを挿入すると、私は(tag_mapで唯一のエントリはそのtag_idにあった場合、私はまた、ゴーストエントリを防ぐために、テーブルtags2にそのタグを削除し、そのvid_idためtag_mapにすべての私のエントリを削除対応するtag_mapエントリのないタグエントリ)。

これで、挿入するときに各タグを進めて、そのタグがtags2テーブルに存在するかどうかを確認します。もしそうなら、私はtag_idを取得し、tag_mapテーブルにエントリを挿入します。そうでなければ、私は両方のテーブルに挿入します。 これを行うより良い方法はありますか?誰かが私がtags2tag_mapの両方に外部キーを持っているべきだと言いましたが、それでもtag_idを得ることができるので、タグが存在するかどうかを確認する方法はまだわかりません。tag_idtag_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セットステータス= 0 WHERE OBJECT_TYPE = xとのobject_id = Y -normally

各タグ{ タグがタグに存在しないため

を爆発テーブル には - 挿入しないとIDを取得します はい - 取得IDです。 UPDATEのtag_rel SETステータス= 1 OBJECT_TYPEの= xとOBJECT_ID = Y、およびTAG_ID = ID }

うん、それはそれを行うための私の最高の方法だろうと私はこのクエリについて少しわからない、ほとんどの業界標準を、と思います。

SELECT * FROM tag_map CNTとして、COUNT(tags2.name)は、JOIN tags2 ON tags2.tag_id = tag_map.tag_id video.vid_id = tag_map.vid_id WHERE tags2.name =で動画を登録しようか?

私はここで助けてくれることを願っています。 リチャード

+0

基本的には、私が挿入したままにしておくべきですが、私のtag_mapテーブルを変更して柔軟性を高めるためにステータスフィールドを変更すると言っていますか?データベースの専門家は、tag_idフィールドに外部キーを追加する必要があると言いましたが、私はそれを確信できないように私を助けるのを止めました。それについての考えは?あなたの時間のおかげでリチャード。 – Scarface

関連する問題