Php 更新标签列表-或更新有许多关系

Php 更新标签列表-或更新有许多关系,php,mysql,has-many,has-many-through,Php,Mysql,Has Many,Has Many Through,我经常遇到更新的问题,有很多关系。 例如,让我们看以下三个表: 帖子 标签 张贴标签 当用户创建新帖子时,他可以向帖子添加标签。将保存帖子,并通过_posts\u tags\u将选定的标签附加到帖子 当用户编辑帖子时,可能也会编辑标签列表,也可能不会编辑标签列表,并且提交表单时,我必须更新帖子的标签列表 解决方案如下:更新帖子时,我从_posts_tags_中删除该帖子的所有标签,然后插入提交的标签 另一个解决方案是从数据库中获取帖子的所有标签,将列表与提交的列表进行比较,然后决定我们必须删除什

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

帖子 标签 张贴标签 当用户创建新帖子时,他可以向帖子添加标签。将保存帖子,并通过_posts\u tags\u将选定的标签附加到帖子

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

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

另一个解决方案是从数据库中获取帖子的所有标签,将列表与提交的列表进行比较,然后决定我们必须删除什么和插入什么

这两种解决方案都很耗时。
对于这个问题,有什么更聪明的解决方案呢?

当一篇文章被编辑而标签没有被编辑时(可选),只需保存文章,什么也不做即可。为什么?因为,在posts、tags和posts_tags表中,有一个autoincrement列是主键。然后,该数字列是各表中的外键,即各表如下所示:

帖子:id\u postk,帖子标题,帖子内容

标签:id\u tagPK,tag\u name

posts\u标签:id\u post\u tagPK、id\u postFK、id\u tagFK

主键 FK:外键

以这种格式保存数据后,您将发现不需要更新任何依赖表,因为文本数据不再用于维护数据库模式和关系。这也加快了事务时间,因为数据库并不像Bono所暗示的那样在任何级联作业中都很忙

然后对post中的所有标记运行一个简单的循环,对照post_标记表中的id_post检查它们的存在,如果没有找到,则插入它。执行此循环时,请生成一个字符串,您将在下面使用该字符串:

接下来,运行以下查询:

delete from post_tags where id_post = {$id_post} and id_tag not in {$list_id_tags}

此操作通过最小化因添加和删除行而导致的IO操作来最小化数据库服务器过载。如果删除所有post_标记,然后再次插入所有标记,则会产生较大的IO,而此方法会将其降至最低。

如果编辑了一篇文章而未编辑标记,则可以选择,只需保存该文章而不执行任何操作。为什么?因为,在posts、tags和posts_tags表中,有一个autoincrement列是主键。然后,该数字列是各表中的外键,即各表如下所示:

帖子:id\u postk,帖子标题,帖子内容

标签:id\u tagPK,tag\u name

posts\u标签:id\u post\u tagPK、id\u postFK、id\u tagFK

主键 FK:外键

以这种格式保存数据后,您将发现不需要更新任何依赖表,因为文本数据不再用于维护数据库模式和关系。这也加快了事务时间,因为数据库并不像Bono所暗示的那样在任何级联作业中都很忙

然后对post中的所有标记运行一个简单的循环,对照post_标记表中的id_post检查它们的存在,如果没有找到,则插入它。执行此循环时,请生成一个字符串,您将在下面使用该字符串:

接下来,运行以下查询:

delete from post_tags where id_post = {$id_post} and id_tag not in {$list_id_tags}

此操作通过最小化因添加和删除行而导致的IO操作来最小化数据库服务器过载。您删除所有post_标记,然后再次插入所有标记的情况会产生较大的IO,而这种方法会将其最小化。

我有点累,有点昏昏欲睡,所以请容忍我可能读错了,但这不是级联的原因吗?@Bono:不是。问题不是如何在外部表中的相关记录之间级联更新,而是如何检测在应用程序中修改了一组记录中的哪一个,以便在数据库中反映这些修改。使用索引的删除将比第二个索引所需的比较类型更快。至于找到一个更聪明的解决方案,你是否应该考虑应用这里?我有点累和昏昏欲睡,所以忍受我可能已经读错了,但这不是级联是为了?@博诺:不,问题不是如何级联更新相关表中的外国表,而是如何检测在应用程序中修改了一组记录中的哪一个,以便在数据库中反映这些修改。使用索引的删除将比第二个索引所需的比较类型更快。要找到更聪明的解决方案,你应该考虑应用这里吗?