有两张表:报价主表及报价明细表,两个表的主要字段如下:
QuoteHeader(报价主表)
     quoteKey  int            ---主键
     quoteName varchar(50)    ---报价表名
      customer  varchar(50)    ---客户
      totAmount decimal(8,2)   ---总价
QuoteDetail(报价明细表,里面列的是一些商品内容)
     detailKey  int           ---明细表主键
      quoteKey   int           ---主表外键(建索引)
      productName varchar(50)  ---商品名称
      qty         int          ---商品数量
      unitPrice   decimal(8,2) ---商品单价
      totAmount   decimal(8,2) ---商品单项总价
      detailOrder int          ---商品在报价表中的排列位置主表每年会产生3万条记录,每个主表大概对应300条明细,也就是明细表每年会产生900万条记录。我的问题如下:
1)用户在应用程序操作时,可以在应用程序明细表添加新的记录(insert),或者是更新已有记录内容(update),
   或者是删除已有记录内容(delete)。然后再点击保存按钮将这些数据提交到数据库。
   提交到数据库的方法有两个:
   方法一:在存储过程中将原来quoteKey对应的记录全部删除,再将提交过来的数据批量插入到明细表。
   方法二:在存储过程中判断提交过来的数据,如果‘原来表中没有’的记录是报行insert操作,如果‘原来表中有但
           提交过来数据没有’的执行delete操作,如果‘原来表中有提交过来数据也有’的记录执行update操作。   困惑:这两种方法各有什么优缺点,请指教。2)由于在问题1)中数据从应用程序提交到数据库是存在xml中,我有种想法将明细表改为如下:
         detailKey   int      ---明细主键
          quoteKey     int      ---主表外键
          xmlContent   xml      ---其余内容都打包存放在此字段
   这种方法较1的好存就是数据的更新操作方便,应用程序内容更新后,我只要insert或update xmlContent字段的内容
   就行了。但有一个明显的缺点是,以后想利用报价明细表的内容时就显出很大的不方便。比如公司想得出那种商品的销量
   最好统计工作就很辛苦了,必须从XML字段中提取数据才行。3)在明细表中有一个detailOrder字段,作用如下:假如现在一个报价表中有四个商品,
            detailKey  quoteKey   productName     detailOrder
             1          1           商品1            1
             2          1           商品2            2
             4          1           商品3            3
             11         1           商品4            4
    detailOrder的作用是排序商品。比如现在用户想将商品4排到商品1与商品2之间,在应用程序中的实现是用鼠标将商品
     4拖到商品1与商品2之间,那么此时是否要更新所有记录的detailOrder,还是只更新商品4的detailOrder,比如从4
    更新为1.5(比如而已,现在字段是整型)。这种情况应该怎么设计较好?
问题比较多,而且感觉可能有很多地方没有描述好,如果大家看不懂,我再详述。
最多只能给100分吗?如果不够,我再开帖给。谢谢各位先!!

解决方案 »

  1.   

    1,
    2,xml数据存储是较好.但要求相应的技术.
    3,你的想法好.但仍有限制,比如某用户无聊,拉来拉去的...感觉还是按常规,写个排序函数.
      

  2.   

    to budong0000 :
    首先感谢您的回复。2,xml数据存储是较好.但要求相应的技术. 
    =>请问指的是什么技术?3,你的想法好.但仍有限制,比如某用户无聊,拉来拉去的...感觉还是按常规,写个排序函数
    =>写个排序函数,也是按某一个条件排序。我现在的问题是,按detailOrder字段去排序,
      问题是在用户的drag drog事件结束后要重新理新所有记录的detailOrder,有没有比较
      好的方法可以达到此目的。
      

  3.   

    1)用户在应用程序操作时,可以在应用程序明细表添加新的记录(insert),或者是更新已有记录内容(update), 
      或者是删除已有记录内容(delete)。然后再点击保存按钮将这些数据提交到数据库。 
      提交到数据库的方法有两个: 
      方法一:在存储过程中将原来quoteKey对应的记录全部删除,再将提交过来的数据批量插入到明细表。 
      方法二:在存储过程中判断提交过来的数据,如果‘原来表中没有’的记录是报行insert操作,如果‘原来表中有但 
              提交过来数据没有’的执行delete操作,如果‘原来表中有提交过来数据也有’的记录执行update操作。   困惑:这两种方法各有什么优缺点,请指教。 我谈下第一个问题:
    方法一:如果存在父表对应的子表记录,这些记录在用户的提交里面既没有删除,也没有更新,那么你全部删除然后批量提交不是就丢失了这些记录吗?
    我看了下ling to sql,里面对于这样的问题是在datacontext里面有三个集合:UPDATES, DELETES, INSERTS,对不同的集合利用不同的sql命令完成提交任务。
    接下来,你也应该在你的程序里面建立三个集合,然后将客户提交的数据到子表里面去查询,依照查询结果分别放到不同集合,
      

  4.   

    从数据存储考虑,感觉表设计不够好。主表中,可以考虑把customer 提取出来另建一个customer表。
    明细表中,也可以考虑把product提取出来建立一个product表。
      

  5.   


    这个是当然,customer存的应该是customerID,product存的应该刘productID,这是在这里我没有说明。谢谢您。
      

  6.   

    to lwb75:
    1)数据不会丢失。因为客户端里已经加载了数据库的所有数据。在事务中处理这个过程,不会有问题的。缺点就是会造成数据的频繁更新。就是用户只更新一条记录的一个字段,也要将明细表的几百条记录全部删除,再重新插入,这种方法看来像是行不通。
    2)我的方法2就像就所说的linq to sql。有个字段在客户端记录那些记录是新增的,那些是更新的,那些是删除的,再分别做具体的操作。这个方法的缺点就是操作麻烦。
      

  7.   

    如果QuoteDetail没有被别的表外键引用的话,可以先删除后新增;
      

  8.   


    如果每更新一个字段,就要删除整个报价表的所有quotedetail记录(约200多条),是否有问题?