2009-05-05 70 views
2

確定這裏是一個問題結合SQL插入和刪除

我有三個表

events 
- id 
- name 

questions 
- id 
- event_id 
- name 

answers 
- id 
- question_id 
- description 

在產生附加的形式,我可以簡單地搜索所有屬於特定事件的問題,並顯示問題在單個HTML表單中。

但考慮編輯方案。活動經理可以在適當的時候添加或刪除事件中的一些問題。因此,在這種情況下,當用戶嘗試編輯已發佈的答案時,我生成的HTML表單的新問題爲空白字段,現有的答案爲預先填寫的輸入框。我如何處理這個表單的提交?

當用戶提交時,我應該刪除所有以前的答案,並在答案表上對所有答案值進行INSERT?或者最好是先更新現有答案並只插入新值?

前者明顯更容易使用DELETE,然後使用INSERT。後者有點乏味。以前的解決方案的問題是答案表的編號將每次增加。

回答

3

有些人贊成刪除/插入方法,因爲像你說的那樣,它更簡單。

我個人認爲更新/插入/刪除的方法,雖然更多的工作,是更正確的。

如果您執行更新,則可以對特定項目的更改進行審計跟蹤。只需插入/刪除,要麼具有這種聯繫和歷史,要麼更加困難,要麼根本不可能。

至於如何處理表單的提交,對於可更新的字段(即它們是現有記錄),您需要能夠以某種方式識別該字段。就個人而言,我只是在字段名稱中編碼類似主鍵的東西。

如果你這樣做,你當然必須通過驗證提供的ID是否有效並允許編輯,即永不信任客戶端來確保你沒有安全漏洞。

這可以採取以下形式:

<input type="text" name="name_117" value="Some value"> 
<input type="text" name="name_118" value="Some other value"> 
<input type="text" name="name_1243" value="Yet another value"> 

,你必須處理所有的輸入參數,解碼標識符和採取相應的行動。

最後,插入/刪除的另一個問題是,如果您要刪除/插入的項目與數據庫中的其他表格相關,則無法執行該操作(或者確實很難)。如果您有問題表並存儲人們給出的答案,通常您會將該問題作爲外鍵引用。如果您刪除/插入而不是更新,則會丟失該關聯。

+0

啊我覺得編碼輸入表單中現有的ID不安全。我想這是一個正常的做法。感謝您的快速回復。 – bibstha 2009-05-05 05:31:32

0

首先,身份證不應該用於任何事情,所以忽略增量是一個很好的提醒。

我寧願處理主要問題,但是,在一切情況下,一切都是平等的。用戶是否實際上通過編輯建立了一組不同的問題?然後將它們保存爲新的集合。還是原來的集合旨在保留其概念身份?然後更新/刪除/插入。這似乎更多的情況下。

就確保問題/答案集的完整性而言,我認爲會議有責任。您應該考慮驗證與會話相關的問題集。

+0

是編輯屬於同一個集合,沒有不同。我想插入/更新/刪除是要走的路。謝謝 – bibstha 2009-05-05 05:32:15

0

在線測驗應用程序通常在測驗生效後鎖定測驗。處理已完成的答案集與問題的變化定義相比,這是一個混亂的問題。如果您的應用程序可以處理它,我希望在事件首次發佈後不允許更改問題。

0

同意克萊圖斯後,一個額外的理由和想法seperately寫着:

的刪除/插入方法有一個併發的問題,當你的網站得到了一些交通繁忙。其他人可以在刪除後進行插入操作,然後每個用戶最終得到多個答案列表。

MySQL支持ON DUPLICATE KEY UPDATE語法。如果你有一個合適的主鍵,這可能是一個簡單的方法來結合插入和更新。