问题描述
(问题一)系统中要删除一些用户表的数据,用户表的外键比较多,而且要备份我现在想到的处理方式有几种:加入有如下的几张表: song(song_id,artist_id,favorite_num) 即 歌曲表(歌曲ID,艺人ID,被收藏次数) song_favorite(fav_id,song_id,user_id) 即 歌曲收藏关系表 (收藏ID,歌曲ID,用户ID) artist(artist_id,song_num) 即 艺人表 (艺人ID,收录的歌曲数) artist_song(artist_id,song_id) 即 艺人歌曲关系表(艺人ID,歌曲ID)现在要删除歌曲表,如果全部采用数据库的机制,可以这样做:1.删除song表数据,数据库外键自动级联删除 song_favorite表数据、删除artist_song表数据,触发器更新 artist表的 song_num = song_num-1 ,触发器备份 song表,song_favorite,artist_song数据到备份表 这样的话,java 代码中就只要去删除歌曲表的数据,其他相关的操作由数据库完成2.不采用触发器,1 中的操作全部写在存储过程当中 java代码只调用这个存储过程 3.全部在java代码中写删除和更新语句。并控制在一个事务内。以上哪种方式较好呢? 另一个困惑我很久的问题:(问题二)以上删除全部是物理删除然后备份,如果采用逻辑删除呢? 即只在歌曲表 song 做个标记为删除,song_favorite表的数据部删除,以免在删除后用户查看收藏的歌曲时,发现收藏的歌曲少了,而不知道是被管理员删除了(有的站点做法是,删除后的数据,用户在 收藏的歌曲这个界面还可以看到删除的歌曲,但是点过去的时候,提示,该歌曲已被删除,然后建议用户从收藏夹中移除,即让删除song_favorite表数据的工作交给用户主动去触发。 我想这种方式的话,对方一定用的是逻辑删除歌曲表)以上各种方式,该如何选择呢? 望各位有经验的兄弟指教。
解决方案
因为提到了级联删除,那么楼主是否用到了一切持久层框架呢。如果是的话,那么在使用数据库删除的时候就需要考虑这样做是不是会用持久层框架的缓存同步的问题。在数据库做的动作,持久层框架是不知道的。另外的话,既然用java了,那么就都交给java做吧,跨平台这种说说的也算个理由吧。具体应用中应该不会遇到换数据库这种要求。对于第二个问题就看实际需要了,把问题抛给客户吧, 他要怎么样就怎么做好了。
解决方案二:
级联删除还是不要为好。自己用代码控制,可控性更高。我们公司用持久层都不带级联删除的,这样做也有风险。