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

问题描述

(问题一)系统中要删除一些用户表的数据,用户表的外键比较多,而且要备份我现在想到的处理方式有几种:加入有如下的几张表: 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做吧,跨平台这种说说的也算个理由吧。具体应用中应该不会遇到换数据库这种要求。对于第二个问题就看实际需要了,把问题抛给客户吧, 他要怎么样就怎么做好了。
解决方案二:
级联删除还是不要为好。自己用代码控制,可控性更高。我们公司用持久层都不带级联删除的,这样做也有风险。

时间: 2024-08-10 07:42:25

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

ASP.NET 2.0数据教程之四十二:为删除数据添加客户端确认

返回"ASP.NET 2.0数据教程目录" 如我们在综叙:在DataList里编辑和删除数据 里看到的,为DataList添加 删除功能可以通过以下完成: 在ItemTemplate里添加Button, LinkButton, 或ImageButton 将Delete button的 CommandName 设为 "Delete" 在DeleteCommand事件处理里调用合适的BLL delete方法 (然后重新绑定数据,来让刚删除的项不再在DataList里显示

oracle后台删除数据,前面页面访问很慢

问题描述 这几天有一个系统出了个情况,在后台删除数据的时候,前台页面去登录访问非常慢.服务器内存24G,SGA:7G,PGA:3G.WEB系统是用IIS做服务的,是一个.net的系统.数据库是oracle10G,请问这会是什么问题. 问题补充:删除和访问不是同一张表. 解决方案 110G如果表的设计都只是放在几张里,那最好把表分区,库分区,索引也分开放,不然估计你删除的时候磁盘IO很大你可以看看ORACLE10的性能监控页面,在操作变慢时,是什么导致这个原因的http://localhost:1

ERP基础档案管理模块中实现多级分类档案级联删除技术

erp ERP基础档案管理模块中实现多级分类档案级联删除技术   本存储过程实现了多级分类档案级联删除技术 本存储过程的特点是: n          可以在不同的数据库表上应用此存储过程,以达到通用化 n          同时用户也可以根据不同的表结构,选择相应版本的的存储过程,在这里共有三个版本可供用户选择,分别对应表结构中有无节点的深度字段等情况 进行调用本存储过程时只需要传递节点号及表名即可,但是用户选择相应版本进行应用时,需要针对实际情况作出选择 版本一 CREATE procedu

解析Oracle中多表级联删除的方法

创建数据库时为了防止其他人不小心删除操作错误, 所有的外键都没有加级联删除.哪知,不知什么时候自己入了一批错误的数据进去,入库使用的是软件自动的,一下点错给自己带来无尽麻烦啊,删除就不好办了   表间的关系比较复杂,数据量又比较多,一个个删绝对会出大问题.于是实验了几种解决的办法,现小结一下. 方法一:创建约束时设定级联删除(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)SQL语句: 复制代码 代码如下: CREATE TABLE "U_WEN_BOOK"."

代码-oracle数据库写触发器解决级联删除问题

问题描述 oracle数据库写触发器解决级联删除问题 请问写一个触发器,怎么在根据id删除商品时,用触发器删除这个商品对应的购物车表项,订单明细表,以及这个订单明细表对应的订单表,删除这个订单表时还要删除这个订单表中对应的其他明细表,谢谢了,最好能有点代码,求教各位了 解决方案 创建数据库时为了防止其他人不小心删除操作错误, 所有的外键都没有加级联删除.哪知,不知什么时候自己入了一批错误的数据进去,入库使用的是软件自动的,一下点错给自己带来无尽麻烦啊,删除就不好办了. 表间的关系比较复杂,数据量

Oracle中多表级联删除的语句总结

最简单快速的删除 下面要讲到了涉及多表级联删除到数据量较大以及表间关系比较复杂时才有效率上的优势,简单的直接删除来的更快      如上例中,直接删除  代码如下 复制代码      DELETE FROM "FG123"."ORDERCOMBINE"      WHERE VIPForm ='1':      DELETE FROM "FG123"."ORDERCOMBINE"      WHERE FormerId ='1

ASP.net在gridview中删除数据时同时更新xml文件

asp.net|xml|数据 为了减少对数据库的访问,前台页面通常只对xml文件进行读取,但是更新数据库的时候需要同时更新xml文件,添加好办,但是删除的时候呢,下面的程序在gridview中删除数据的同时删除xml文件中对应的节点.xml文件的每个节点是一个图片新闻,包括图片和新闻页面的本地存储路径.   using System;using System.Collections;using System.ComponentModel;using System.Data;using Syste

ASP.NET 2.0数据教程之十六: 概述插入、更新和删除数据

返回"ASP.NET 2.0数据教程目录" 导言 结束前面的几节,我们已经探讨过了如何使用GridView.DetailsView 和FormView控件来显示数据.这些控件简单地操作提供给它的数据.一般地,这 些控件通过使用一个数据源控件,例如ObjectDataSource来存取数据.我们已经 看过了ObjectDataSource是如何在ASP.NET页面和潜在的数据之间扮演一个代理的 角色.当一个GridView需要显示数据时,它调用ObjectDataSource的Selec

ASP.NET 2.0数据教程之四十九:使用SqlDataSource插入、更新以及删除数据

返回"ASP.NET 2.0数据教程目录" 导言 在概述插入.更新和删除数据中我们讨论过,GridView控件提供 了内建的更新与删除功能,而DetailsView和FormView控件除了这些之外还拥有插 入功能.这些数据修改功能可以直接接入到数据源控件中而不需要编写任何代码 .概述插入.更新和删除数据讲解了如何使用ObjectDataSource来帮助GridView .DetailsView以及FormView控件完成插入.更新以及删除操作. ObjectDataSource能工