(问题一)
系统中要删除一些用户表的数据,用户表的外键比较多,而且要备份我现在想到的处理方式有几种:
加入有如下的几张表:
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表数据的工作交给用户主动去触发。 我想这种方式的话,对方一定用的是逻辑删除歌曲表)
以上各种方式,该如何选择呢? 望各位有经验的兄弟指教。