2011-10-19 2 views
2

나는라는 테이블이 태그 열 id, vid_id, ID가 md5(uniqid()); vid_id 생성 임의의 ID입니다 name가 태그와 관련된 비디오의 ID입니다, 그리고 이름은이다 태그 이름. 동영상에 5 개의 태그가있는 경우 모두 태그 테이블에 저장됩니다. 최근 중복 태그가 많아서 요즘 테이블 디자인이 좋지 않다는 것을 깨달았습니다. 다른 테이블을 만들었습니다 tag_map. 그것에는 세 개의 열 id, vid_id, tag_id이 있습니다. 기본적으로 여기에 표시된 'toxi'솔루션을 구현하고 싶습니다. http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html. 각 tag_map 항목이 하나 개의 태그 항목에 매핑되도록 할 원하는 것은 태그에 여분의 항목을 tag_map태그부터 데이터를 전송 태그을에 vid_id 열을 삭제하고 삭제 어떻게 든표준화 데이터베이스 테이블 "태그"

. 누구든지 효율적인 방법을 알고 있습니까? 나는 계속 생각 :

$sql = 'SELECT * FROM tags'; 
$stmt3 = $conn->prepare($sql); 
$result=$stmt3->execute(); 
while ($row = $stmt3->fetch(PDO::FETCH_ASSOC)) { 

$id=md5(uniqid()); 

    $sql = 'INSERT INTO tag_map VALUES (?,?,?)'; 
$insert = $conn->prepare($sql); 
$result=$insert->execute(array($id,$row['vid_id'],$row['id'])); 
} 

을하지만 난 테이블에 태그을 여분의 태그를 제거하고 단 하나의 태그 항목에 대한 각 tag_map 항목을지도하기 위하여려고하고있다 방법을 생각하려고 할 때 그때 혼란스러워. 모든 조언을 크게 주시면 감사하겠습니다.

답변

2

난 당신의 게시물을 이해한다면, 그때 당신이 뒤에있어하는 것은 (다시 읽기시, 그래, 이것은 당신이 언급하고있는 "Toxi"솔루션입니다.이 이름이 "Toxi"하지만 무엇을 어디서 얻었는지 확실하지.) 당신은 테이블을 갖고 싶어

http://en.wikipedia.org/wiki/Junction_table

주어진 동영상에 정확히 하나의 행이 있습니다. 그리고 각 태그에 정확히 하나의 행이있는 다른 테이블. 그 다음에는 비디오와 태그의 모든 조합에 대해 하나의 행이있는 세 번째 테이블이 있어야합니다. 이렇게하면 주어진 태그와 일치하는 모든 비디오 또는 주어진 비디오와 일치하는 모든 태그에 대해 세 번째 조인 테이블을 쿼리 할 수 ​​있습니다.

새 테이블 "태그"와 테이블 "video_tag"를 만들 것입니다.

foreach (video_record in the video table) { 
    existingTags = read in list of tags for video_record from existing_tags_table 
    foreach (tag in existingTags) { 
     newTag = read tag from new tag table 
     if (newTag == null) { 
      save tag in new table 
      newTag.name = existing tag name 
      newTag.id = id from save procedure above 
     } 
     save entry in video_tag(video.id, newTag.id) 
    } 
} 

그런 다음 이전 태그 표를 삭제하십시오. 원하는 경우 새 태그 테이블의 이름을 바꿉니다.

+0

제가 조인 테이블을 가지고 있습니다. 이 테이블은 tag_map이며 테이블 태그와 테이블 비디오를 조인합니다. 내가 가지고있는 문제는 전에 조인 테이블이 없었기 때문에 태그에이 모든 항목이 있습니다.필자는 현재 태그에있는 데이터를 구성하고 tag_map에 재배포하여 구조가 올바르게 작동하도록해야합니다. – Scarface

+0

답변을 수정했습니다. – Marvo

+0

Marvo 나를 도와 주셔서 감사합니다. – Scarface

2

당신이 할 수있는 한 가지는 새로운 tag_map 테이블에서 기본 키로 vid_idtag_id 쌍을 설정하는 것입니다. 이렇게하면 위에서 나열한 알고리즘을 수행 할 때 중복 된지도 항목이 생성되지 않지만 각 태그에 대해 하나씩지도 항목이 생성됩니다. 그런 다음이 하나 같이 tags 테이블에 중복을 삭제하는 쿼리를 실행할 수 있습니다. "테이블을 조인"A "접합 테이블"또는

DELETE FROM TAGS WHERE ID NOT IN (SELECT tag_id FROM TAG_MAP) 
+0

입력 해 주셔서 고맙지 만 사람이 작동하지 않습니다. vid_id 및 tag_id는 table_map 테이블에서 고유하지 않습니다. 동일한 동영상에 대해 많은 항목이있을 수 있으며 tag_id를 사용하여 다른 동영상을 동일한 태그에 매핑 할 수 있습니다. – Scarface

+0

내가 말하고자하는 것은 (vid_id, tag_id) 쌍이 tag_map 테이블의 기본 키 여야한다는 것입니다. 그렇게하면 다른 vid_id에 동일한 tag_id 맵을 여전히 가질 수 있지만 정규화 중에는 중복 항목을 삽입 할 수 없습니다. 나는 내 자신의 프로젝트에서 비슷한 것을하고있다. 아마도 여기에 뭔가 빠졌을 것입니다 :) – Mirthquakes