日期:2014-05-20  浏览次数:21003 次

數據刪除策略問題﹐急...
我現在對一些數據進行操作﹕
有Quality(id,name)材質表
有Material(id,name,qualityid)原材料表

問題﹕
在刪除Quality中的一行時該采用什么方法?

1.先檢查在Material中是否有引用﹐如果無﹐則直接將其刪除(或者在Quality中再添加一個字段State(bit)﹐將其修改為0﹐使數據降級)﹐這樣做效果是最好的了﹐但同時也是最不可取的﹐因為我打算寫一個易擴展的系統﹐如果每次在刪除之前都去檢查引用﹐那么以后如果修改了庫結構或是增加了新的引用﹐那么就不得不去修改之前的程序
2.直接在Quality中加入State(bit)字段﹐每次刪除時﹐不管3721將State修改為0﹐然后所有有引用Quality的id的地方都變為空值。很多系統就是用這種方式﹐但是客戶很難接受﹐因為之前定義的好好的資料﹐突然都成了空白﹐非常非常不舒服﹐我沒寫程序之前最痛恨這種程序
3.同2﹐加入State,刪除時也是將State修改為0﹐但是在有引用Quality的地方繼續顯示當時添加(編輯)引用的地方引用該Quality的id﹐只是在新增時已經看不到State標記為0的Quality的id了﹐這種方法也似乎不妥﹐明明不存在的數據﹐卻挂在了不該出現的位置...


各位兄弟是怎樣處理這種問題的呢﹐盼回

------解决方案--------------------
看业务情况,1方式和3方式比较常用,最常用的是3方式,虽然有无用数据但不会因为误操作丢失数据。

你还可以使用查数据表外键的方式,将所有约束的数据项清除然后再删本表数据,这样的危险性也很大,不提倡使用。
------解决方案--------------------
我比较赞同第二种做法,前提是管理员必须对系统非常了解;第二种方案的补充意见是:当你删除Quality中的一行時,不要物理删除,只要修改其状态就可以了.
------解决方案--------------------
你首先需要弄清楚这两表是否是真正的主从表,

如果是主从表,你可以使用数据库的外键级联删除功能,那么删除主表信息,从表记录会被系统自动删除。

如果不是纯粹的主从表,即从表有记录要防止主表删除,你可以使用存储过程,把判断以及删除放到存储过程中,这样可以简化程序操作。
------解决方案--------------------
Knight94(愚翁) ( )
又见高人来!
有问题赶紧问!
------解决方案--------------------
第二種方法:增加一字段標識此記錄是否有效,這樣比較好吧,刪除時設為無效即可,其它地方引用此表記錄的都要加上有效的條件
------解决方案--------------------
to 我是想在刪除Quality時在存儲過程中去判斷是否在Material中是否存在引用﹐如果存在﹐則不能刪除﹐但是如果在這之后﹐我又加入了 StandardPart(標准品)表﹐而這個表又要引用Quality表中的行﹐那么﹐我又不得不去修改ut_QualityDelete存儲過程﹐如果后面又增加一個表引用Quality...﹐這樣的話﹐我得改到何年何月呀

那你用我给你的第二个建议,把删除判断做到存储中,减少程序端的处理。
------解决方案--------------------
有Quality(id,name)材質表
有Material(id,name,qualityid)原材料表
^^^^^^^^^^^^^^^^^^^^^^^^^
说说自己的看法
Quality(id,name)材質表
Material_Quality(Materialid,Qualityid)增加表
Material(id,name)原材料表
StandardPart
StandardPart_Quality
^^^^^
如果能设计成这样 是不是就没那些问题了

------解决方案--------------------
to 说说自己的看法
Quality(id,name)材質表
Material_Quality(Materialid,Qualityid)增加表
Material(id,name)原材料表
StandardPart
StandardPart_Quality
------解决方案--------------------
赞同 Knight94(愚翁) 的说法。
把删除判断的操作都放存储过程中,其实这样的改动在程序设计中来说应该是比较小的了。
------解决方案--------------------
建立一个类似日志一样的表PFLogo
PFLogo(id,ptable,ftable)
如果你有新建了一个表(newtable),并且这个新表和原来的某个表有关联就在这个表里记录一下比如
id ptable ftable
-------------------------
1 Quality Material
2 Quality newtable
3 other1 other1f1
4 other1 other1f2
然后再修改你原来的存储过程,每次删除主表时来检测一下PFLogo这个表,如
select ftable from pflogo where ptable= 'Quality '
这样可能会找到N个结果....剩下的就是存储过程中写代码的问题了..