2011-10-19 57 views
2

我有一个名为表标签vid_ididname其中id是md5(uniqid()); VID_ID产生的随机ID是标签与相关视频的ID,并将其命名为标签名。如果视频有5个标签,则它们全部存储在标签表中。我最近意识到这是一个糟糕的桌子设计,因为我有很多重复的标签。我创建了另一张表tag_map。它有三栏id,vid_id,tag_id。我想基本实施这里显示的'toxi'解决方案http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html规范化数据库表的“标签”

我想要做的就是以某种方式在标签从标签在将数据传输到tag_map,在标签删除VID_ID列,并删除任何额外的条目,以便每个tag_map项只能映射到一个标签条目。任何人都知道有效的方法来做到这一点?我一直在想:

$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

您可以做的一件事是将vid_idtag_id对设置为新的tag_map表中的主键。这样,当你通过上面列出的算法时,将不会创建重复的地图条目,但每个标签仍然会有一个。然后,您可以运行查询来删除重复的tags表像这样的:

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

感谢您的意见,但这不会工作的人。 vid_id和tag_id在表tag_map中不唯一。可能有许多相同视频的条目,并且可以使用tag_id将不同的视频映射到相同的标签。 – Scarface

+0

我想我想说的是(vid_id,tag_id)对应该是你的tag_map表的主键。这样,您仍然可以将相同的tag_id映射到不同的vid_id,但是在标准化过程中不允许插入重复的条目。我在自己的项目上做了类似的事情。我可能在这里错过了一些东西:) – Mirthquakes