2010-06-22 70 views
0

比方说,我们这些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. 循环的项目,并作出查询来决定:如果存在是一个INSERT,否则,是一个更新。
  2. 删除所有项目(按帐单ID),然后,做所有插入。
+0

什么DB引擎潜在的请? – gbn 2010-06-22 16:36:00

+0

两个表格之间的映射(文章是“网格”表格),说明并不尽如人意。外键关系也相当重要。也不清楚'uid int'在订单中被表示为'pepe'。请注意,当用户从网格中删除一行时,您必须确保文章表中的相应行也被删除。 – 2010-06-22 16:40:32

+0

引擎是MSSQL。 – mRt 2010-06-22 21:09:18

回答

2

的写入两个表如果你只有两个选择,这将主要取决于你的需求,你想优化的使用情况。这就是说,你应该考虑以下

性能

在备选方案1中删除所有的文章都将需要更长的时间。

在选项2中添加没有文章的条例草案与10篇文章将采取相同的时间增加10篇文章的条例草案没有文章。

审计

方案2是非常困难的审核

并发 假设应用程序没有并发检测

两个用户在同一时间打开该法案。每个用户添加五篇文章并点击保存。

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

我不能说哪个是正确的。

事务性能

当添加到现有的账单物品交易将需要更长的时间比需要在选项2,这增加了死锁该用例的可能性。

保存失败而没有交易支持这假定您的应用程序不使用交易。

在备选方案1有一个潜在的新的物品可能会丢失,删除,应该已经被删除的文章不是

在方案2有一个为丢失的所有物品

3

既不

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

包裹在一个事务中