feixiang2005 2010-08-26 15:58
浏览 266
已采纳

更新、删除数据的困惑,该不该用触发器,级联删除?

(问题一)
系统中要删除一些用户表的数据,用户表的外键比较多,而且要备份我现在想到的处理方式有几种:

加入有如下的几张表:
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表数据的工作交给用户主动去触发。 我想这种方式的话,对方一定用的是逻辑删除歌曲表)

以上各种方式,该如何选择呢? 望各位有经验的兄弟指教。

  • 写回答

2条回答 默认 最新

  • Rambing 2010-08-26 16:15
    关注

    因为提到了级联删除,那么楼主是否用到了一切持久层框架呢。
    如果是的话,那么在使用数据库删除的时候就需要考虑这样做是不是会用持久层框架的缓存同步的问题。在数据库做的动作,持久层框架是不知道的。

    另外的话,既然用java了,那么就都交给java做吧,跨平台这种说说的也算个理由吧。具体应用中应该不会遇到换数据库这种要求。

    对于第二个问题
    就看实际需要了,把问题抛给客户吧, 他要怎么样就怎么做好了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码