更新标签列表 - 或更新has_many关系

时间:2012-05-15 17:04:46

标签: php mysql has-many has-many-through

我经常遇到更新有很多关系的问题。 例如,让我们采用以下三个表:

  • 帖子
  • 标记
  • posts_tags

当用户创建新帖子时,他可以为帖子添加标签。保存帖子,并通过_posts_tags _。

将所选标签附加到其上

当用户编辑帖子时(也可能不编辑标签列表),并且表单已提交,我必须更新帖子的标签列表。

解决方案如下:更新帖子时,我会从_posts_tags_删除该帖子的所有标签,并插入提交的标签。

另一种解决方案是从db中获取帖子的所有标签,将列表与提交的列表进行比较,并确定我们必须删除的内容以及我们必须插入的内容。

这两种解决方案都很耗时 这个问题有哪些更聪明的解决方案?

1 个答案:

答案 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,而这种方法可以最小化。