gpt4 book ai didi

php - 规范化数据库表 "tags"

转载 作者:行者123 更新时间:2023-11-29 01:45:33 26 4
gpt4 key购买 nike

我有一个名为 tags 的表,其中包含 idvid_idname 列,其中 id 是随机 ID generated with md5(uniqid()); vid_id 是标签关联的视频的id,name 是标签名称。如果一个视频有 5 个标签,它们都存储在标签表中。我最近意识到这是一个糟糕的表格设计,因为我有很多重复的标签。我创建了另一个表 tag_map。它具有三列idvid_idtag_id。我想基本上实现此处显示的“toxi”解决方案 http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html .

我想做的是以某种方式将数据从 tags 转移到 tag_map,删除 tags 中的 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']));
}

但是当我尝试考虑如何删除表 tags 中的额外标签并将每个 tag_map 条目映射到仅一个标签条目时,我感到困惑。任何建议将不胜感激。

最佳答案

如果我理解您的帖子,那么您所追求的是“联结表”或“连接表”。 (重新阅读后,是的,这就是您所指的“Toxi”解决方案。不知道“Toxi”这个名字是从哪里来的,但无论如何。)

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

您想要一个表格,其中只有一行对应给定的视频。还有另一个表,每个标签只有一行。然后您需要中间的第三个表,其中一行对应视频和标签的每种组合。这样,您就可以在第三个连接表中查询与给定标签匹配的所有视频,或与给定视频匹配的所有标签。

我会创建一个新表“tag”和一个表“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 )
}
}

然后删除旧的标签表。如果需要,可以对新标记表进行一些重命名。

关于php - 规范化数据库表 "tags",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com