多对多映射(Many-to-many Mapping)表的操作

多多映射表的操作,算是老生常谈了吧!在此抛砖引玉下,谈些最近项目中遇到的问题以及最终解决问题的思路吧!

进入正题吧!
有3张表:用户表(t_user), 组别(t_group), 用户组别映射表(t_gum).
一个用户可以属于多个表, 一个组可以有多个用户, 多对多的映射关系.

用户表的主要字段: user_id, primary key;
组别表的主要字段: group_id, primary key;
映射表的主要字段: group_id, user_id, 两个字段作为联合主键.

这里讲的主要是中间映射表的update操作吧.
多对多映射(Many-to-many Mapping)表的操作

 

 多对多映射(Many-to-many Mapping)表的操作

 多对多映射(Many-to-many Mapping)表的操作


现在有个Update Group User的页面, 可以对一个group里的user进行操作.
比如说把用户”zhangsan”从组”a”里面移除, 再把用户”zhaoliu”加入到组”a”中.
这时候我两种想法:
(1) 先删除表t_gum中所有group_id = ‘a’的记录, 再插入新的记录.
SQL:
delete from t_gum where group_id = ‘a’;
insert into t_gum(group_id, user_id) values(‘a’, ‘lisi’);
insert into t_gum(group_id, user_id) values(‘a’, ‘wangwu’);
insert into t_gum(group_id, user_id) values(‘a’, ‘zhaoliu’);

(2) 将数据库的数据查询出来保存在一个List中,然后与页面form提交过的List进行比较, 再进行相应的操作.
List dbList = {‘zhangsan’, ‘lisi’, ‘wangwu’};
List formList = {‘lisi’, ‘wangwu’, ‘zhaoliu’}
其次再进行两次循环比较;
第一次以dbList为标准: 经过一轮比较发现 ’zhangsan’在formList中不存在,这时候将一条删除语句放入SQL Batch中, 与此同时将’zhangsan’从dbList中移除; 再以formList为标准, 经过一轮比较发现’zhaoliu’在dbList中不存在, 这时将一条插入语句放入SQL Batch中, 于此同时将’zhaoliu’添加到dbList中.
SQL Batch:
delete from t_gum where usr_id = ‘zhangsan’ and group_id = ‘a’;
insert into t_gum(group_id, user_id) values(‘a’, ‘zhaoliu’);

优点: 方法1, 由DBMS执行SQL, 效率比较高; 方法2, 执行的SQL较少
缺点: 方法1, 执行的SQL语句较多, 即使是未作任何改变的数据也要被重新删除再插入一次; 方法2, 应用程序要进行两次循环比较, 循环比较比较耗时.

不清楚一些有名的ORM框架的底层是如何处理这些Many-to-many 映射且有中间表的update处理的.
希望智者不吝赐教, 各抒己见, 谢谢!

 

你可能感兴趣的:(sql,框架,orm)