处理主细节记录的最佳逻辑

时间:2010-06-22 16:30:11

标签: sql logic master-detail

假设我们有这些SQL表:

[Articles] 
bill   int         (pkey)
arti   int         (pkey)
name   varchar(50) 

[Bills]
bill   int         (pkey)
fdate  date
uid    int

假设我们在网格上有一个项目列表,代表一个账单:

--------------------------------------------------------------
Id[      15]  Date [01-01-1980]
User [pepe]

Code   Name
----------------------------
1      Something
2      Article name
3      lolololololoolo
4      datadatdatdatdata
5      datadatdatdatdata
--------------------------------------------------------------

所以,我们有一个标题,一个id,一个用户,一个日期等等。然后,网格中充满了项目。

当用户决定(保存按钮)时,两个表将同时保存。并且,用户还可以查看先前的帐单并对其进行修改。那么,还有什么更好的呢?

  1. 循环项目并进行查询以决定:if exists是否为INSERT,否则为UPDATE。
  2. 删除所有项目(按帐单ID),然后执行所有INSERTS。

3 个答案:

答案 0 :(得分:3)

无论

  • 将网格数据提取为XML,或创建/加载2个临时表
  • 将SQL中的XML解析为临时表,或者读取2个临时表...
  • 根据需要更新或插入(MERGE,ON DUPLICATE等)

将写入包裹到事务中的两个表

答案 1 :(得分:2)

如果您只有两个选择,那么它主要取决于您的要求和您要优化的用例。那说你应该考虑以下

效果

在选项1中删除所有文章需要更长的时间。

在选项2中,对于包含10篇文章的法案,不添加任何文章将花费相同的时间,因为将10篇文章添加到没有文章的帐单中。

<强>审计

选项2很难审核

<强>并发 假设在应用程序中没有并发检测

两位用户同时开帐单。每个用户添加添加五篇文章和点击保存。

在选项1中,您最终会得到10篇文章。 在选项2中,你最终会得到五个。

我不能说哪个是对的。

交易效果

向现有账单添加商品时,在选项2中,交易将花费比需要更长的时间。这会增加该用例死锁的可能性。

在没有交易支持的情况下保存失败这假设您的应用不使用交易。

在选项1中,可能会丢失新文章,删除应删除的文章

在选项2中,所有文章都有可能丢失

答案 2 :(得分:1)

为什么不使用MySQL语法ON DUPLICATE KEY?

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

 INSERT INTO table (a,b,c) VALUES
 (1,2,3)   ON DUPLICATE KEY UPDATE
 c=c+1;