我的表格tags2
包含字段tag_id
和name
。我有一个包含字段tag_map
和tag_id
的联结表vid_id
,用于将表tags2
连接到表video
(通过vid_id)。
当我为vid_id
插入新标记时,如果tag_map
中只有一个条目,我会删除vid_id
中tag_map
的所有条目tag_id
,我还删除了表tags2
中的标记,以防止出现鬼条目(标记没有相应tag_map条目的条目)。
然后我插入时检查每个标记,以检查tags2
表中是否存在该标记。如果是,我得到它tag_id
并在tag_map
表中插入一个条目。如果不是,我插入两个表。 有更好的方法吗?有人提到我应该在tags2
和tag_map
上都有外键,但我仍然不知道如何检查查看表tags2
中是否存在标记,以便我可以获取其tag_id
并将其与tag_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));
}
}
答案 0 :(得分: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 SET status = 0 WHERE object_type = x和object_id = y
- 正常爆炸
每个标签的{ 标签表中是否存在标签 不 - 插入并获取ID 是的 - 得到身份证明。 UPDATE tag_rel SET status = 1 WHERE object_type = x和object_id = y AND tag_id = id }
是的,这是我最好的方式,我认为这几乎是一个行业标准,对此查询几乎不确定。
SELECT *,COUNT(tags2.name)为cnt FROM tag_map JOIN tags2 ON tags2.tag_id = tag_map.tag_id JOIN视频ON video.vid_id = tag_map.vid_id WHERE tags2.name =?
我希望我在这里帮到过。 理查德