我经常遇到更新有很多关系的问题。 例如,让我们采用以下三个表:
当用户创建新帖子时,他可以为帖子添加标签。保存帖子,并通过_posts_tags _。
将所选标签附加到其上当用户编辑帖子时(也可能不编辑标签列表),并且表单已提交,我必须更新帖子的标签列表。
解决方案如下:更新帖子时,我会从_posts_tags_删除该帖子的所有标签,并插入提交的标签。
另一种解决方案是从db中获取帖子的所有标签,将列表与提交的列表进行比较,并确定我们必须删除的内容以及我们必须插入的内容。
这两种解决方案都很耗时 这个问题有哪些更聪明的解决方案?
答案 0 :(得分:0)
编辑帖子并且不编辑标签(可选)时,只需保存帖子并不执行任何操作。为什么?因为,在posts,tags和posts_tags表中,您有一个自动增量列,它是您的主键。然后,此数字列是相应表中的外键,即表格如下所示:
帖子:id_post(PK),post_title,post_content
标签:id_tag(PK),tag_name
posts_tags:id_post_tag(PK),id_post(FK),id_tag(FK)
PK:主键 FK:外键
以这种格式保存数据后,您将无需更新任何相关表,因为文本数据不再用于维护数据库架构和关系。这也加快了事务时间,因为数据库在Bono暗示的任何级联作业中都不忙。
然后为帖子中的所有标签运行一个简单的循环,以检查它们是否存在于post_tags表中的id_post,如果没有找到则插入它。在执行此循环时,将构建一个您将在下面使用的字符串:
接下来,运行以下查询:
delete from post_tags where id_post = {$id_post} and id_tag not in {$list_id_tags}
此操作通过最小化由添加和删除的行引起的IO操作来最小化数据库服务器过载。你删除所有post_tags然后再插入所有标签的情况会产生大的IO,而这种方法可以最小化。