我現在對一些數據進行操作﹕
有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.   

    我比较赞同第二种做法,前提是管理员必须对系统非常了解;第二种方案的补充意见是:当你删除Quality中的一行時,不要物理删除,只要修改其状态就可以了.
      

  2.   

    不是純粹的主從表。Material(原材料表)會使用到Quality(材質表)﹐但是它們之間并不是像Order和OrderDetails那么密切﹐。我是想在刪除Quality時在存儲過程中去判斷是否在Material中是否存在引用﹐如果存在﹐則不能刪除﹐但是如果在這之后﹐我又加入了StandardPart(標准品)表﹐而這個表又要引用Quality表中的行﹐那么﹐我又不得不去修改ut_QualityDelete存儲過程﹐如果后面又增加一個表引用Quality...﹐這樣的話﹐我得改到何年何月呀各位兄弟們在實際項目中用何策略呀?
      

  3.   

    Knight94(愚翁) ( ) 
    又见高人来!
    有问题赶紧问!
      

  4.   

    to 我是想在刪除Quality時在存儲過程中去判斷是否在Material中是否存在引用﹐如果存在﹐則不能刪除﹐但是如果在這之后﹐我又加入了 StandardPart(標准品)表﹐而這個表又要引用Quality表中的行﹐那么﹐我又不得不去修改ut_QualityDelete存儲過程﹐如果后面又增加一個表引用Quality...﹐這樣的話﹐我得改到何年何月呀那你用我给你的第二个建议,把删除判断做到存储中,减少程序端的处理。
      

  5.   

    有Quality(id,name)材質表
    有Material(id,name,qualityid)原材料表
    ^^^^^^^^^^^^^^^^^^^^^^^^^
    说说自己的看法
    Quality(id,name)材質表
    Material_Quality(Materialid,Qualityid)增加表
    Material(id,name)原材料表
    StandardPart
    StandardPart_Quality
    ^^^^^
    如果能设计成这样 是不是就没那些问题了
      

  6.   

    to 说说自己的看法
    Quality(id,name)材質表
    Material_Quality(Materialid,Qualityid)增加表
    Material(id,name)原材料表
    StandardPart
    StandardPart_Quality
    ^^^^^
    如果能设计成这样 是不是就没那些问题了
    我沒看出來這和我的設計的根本區別﹕(
      

  7.   

    to 说说自己的看法
    Quality(id,name)材質表
    Material_Quality(Materialid,Qualityid)增加表
    Material(id,name)原材料表
    StandardPart
    StandardPart_Quality
      

  8.   

    赞同  Knight94(愚翁)  的说法。
    把删除判断的操作都放存储过程中,其实这样的改动在程序设计中来说应该是比较小的了。
      

  9.   

    建立一个类似日志一样的表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个结果....剩下的就是存储过程中写代码的问题了..
      

  10.   

    在pflogo中的工作量相比你新增一个表而言可以忽略不计,而存储过程也不用再去改了,
      

  11.   

    唉﹐關于這種問題不知道什么時候是個定論﹐沒有主張﹐還是采用Knight94(愚翁)的建議為好﹐現在為了設計方便﹐以后客戶還是會要求返工。還不如一次到位呢
    結貼,謝謝大家伙了