2010-06-22 69 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等)

包裹在一個事務中