Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php “规范化数据库表”;标签;_Php_Mysql - Fatal编程技术网

Php “规范化数据库表”;标签;

Php “规范化数据库表”;标签;,php,mysql,Php,Mysql,我有一个名为tags的表,其中包含列id,vid_id,name,其中id是使用md5(uniqid())生成的随机idvid_id是与标记关联的视频的id,name是标记名。如果一个视频有5个标签,它们都会存储在标签表中。我最近意识到这是一个糟糕的表格设计,因为我有很多重复的标签。我创建了另一个表标记地图。它有三列id,vid\u id,tag\u id。我想基本上实现这里显示的“toxi”解决方案 我想做的是以某种方式将数据从标记传输到标记映射,删除标记中的vid_id列,并删除标记中的任何

我有一个名为tags的表,其中包含列
id
vid_id
name
,其中id是使用
md5(uniqid())生成的随机id
vid_id是与标记关联的视频的id,name是标记名。如果一个视频有5个标签,它们都会存储在标签表中。我最近意识到这是一个糟糕的表格设计,因为我有很多重复的标签。我创建了另一个表标记地图。它有三列
id
vid\u id
tag\u id
。我想基本上实现这里显示的“toxi”解决方案

我想做的是以某种方式将数据从标记传输到标记映射,删除标记中的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']));
}

但是,当我试图思考如何删除表tags中的额外标记,并将每个tag\u map条目映射到一个tags条目时,我感到困惑。任何建议都将不胜感激。

您可以做的一件事是将
vid\u id
tag\u id
对设置为新
tag\u map
表中的主键。这样,当您执行上面列出的算法时,不会创建重复的映射条目,但每个标记仍会有一个映射条目。然后,您可以运行一个查询来删除
标记
表中的重复项,如下所示:

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

如果我理解你的帖子,那么你想要的是一个“连接表”或“连接表”。(重读后,是的,这就是你所指的“Toxi”解决方案。不确定它的名称是“Toxi”,但无论如何。)

对于给定的视频,您希望有一个只有一行的表。和另一个表,每个标记正好有一行。然后,您需要在中间有第三个表,每个视频和标记组合有一行。这样,您就可以查询第三个联接表中与给定标记匹配的所有视频,或者与给定视频匹配的所有标记

我将创建一个新表“tag”和一个表“video_tag”


然后删除旧的标记表。如果您愿意,可以对新的标记表进行重命名。

谢谢您的输入,但这样做行不通。vid_id和tag_id在表tag_映射中不是唯一的。同一视频可能有多个条目,tag_id可用于将不同视频映射到同一标记。我想我想说的是,(vid_id,tag_id)对应该是tag_映射表的主键。这样,您仍然可以将相同的tag_id映射到不同的vid_id,但不允许在规范化过程中插入重复的条目。我正在自己的一个项目上做类似的事情。我可能遗漏了什么:)我有一个联接表。该表是tag_map,它连接了表标记和表视频。我遇到的问题是我以前没有连接表,所以我在标记中有所有这些条目。我必须了解如何组织标记中当前的数据,并将其重新分发到标记映射中,以便结构正常运行。非常感谢您花时间帮助我Marvo!做了一个调整,指出当你读入现有标签时,你正在为你刚刚读入的视频记录读入它们。希望那个错误没有耽误你。(当然,您的旧型号的视频ID就在标签表中,所以您可能已经找到了。)祝您好运!
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 )
    }
}