2011-01-13 63 views
1

我已經開發了一個帶有Oracle後端的Java工作流Web應用程序。工作流程要求用戶完成一系列清單。
我開始使用每個清單2個表的項目 - 一個表存儲問題,另一個存儲答案。Java Web應用程序和數據庫設計

但管理層不斷要求更多清單,所以我改變了我的數據庫方法(見下文)。我想知道這種方法是否合適,或者我正在設法解決問題。我正在重構整個應用程序,因爲它沒有遵循MVC方法。現在是糾正任何數據庫設計問題的時候了。

這是我的新方法:

表:

CHECKLIST_CLASS - 存儲類型清單即質量審覈檢查表,過程審覈檢查表的
CHECKLIST_INSTANCE - 用戶清單,正在制定。店FK的checklist_class_id的,work_flow_id
CHECKLIST_ANSWER - 存儲check_list_instance_id的question_id,選擇題答案
CHECKLIST_QUESTION的FK - 存儲question_id的checklist_class_id的FK

我喜歡這種方法,因爲我可以動態地添加新的檢查列表而不添加另一個數據庫表。
但它使查詢有點複雜,尋找確定工作流中每個清單的狀態。

SELECT TO_CHAR(CALCDATEREQUIRED, 'MM/DD/YYYY') as CALCDATEREQUIRED, 
     TO_CHAR(CALCAPPROVEIPRDATE, 'MM/DD/YYYY') as CALCAPPROVEIPRDATE, 
     (SELECT SECTION_I_STATE FROM TPQOT_CALC_MODEL WHERE CHECKLIST_INSTANCE_ID = 
      SELECT MAX(TPQOT_CHECKLIST_INSTANCE.CHECKLIST_INSTANCE_ID) FROM TPQOT_CHECKLIST_INSTANCE 
      WHERE TPQOT_CHECKLIST_INSTANCE.CHECKLIST_CLASS_ID='1257877690209' AND 
      TPQOT_CHECKLIST_INSTANCE.CALC_ID=CALCID AND 
      TPQOT_CHECKLIST_INSTANCE.CALC_REV=CALCREV) ) AS SECTION_I_STATE, 
     (SELECT CHECKLIST_STATE AS FINALIZE_CHECKLIST_STATUS FROM TPQOT_CHECKLIST_INSTANCE WHERE CHECKLIST_INSTANCE_ID = 
      (SELECT MAX(TPQOT_CHECKLIST_INSTANCE.CHECKLIST_INSTANCE_ID) FROM TPQOT_CHECKLIST_INSTANCE 
      WHERE TPQOT_CHECKLIST_INSTANCE.CHECKLIST_CLASS_ID='1257877690209' AND 
      TPQOT_CHECKLIST_INSTANCE.CALC_ID=CALCID AND 
      TPQOT_CHECKLIST_INSTANCE.CALC_REV=CALCREV) ) AS DI4630901_STATE, 
     (SELECT CHECKLIST_STATE AS FINALIZE_CHECKLIST_STATUS FROM TPQOT_CHECKLIST_INSTANCE WHERE CHECKLIST_INSTANCE_ID = 
      (SELECT MAX(TPQOT_CHECKLIST_INSTANCE.CHECKLIST_INSTANCE_ID) FROM TPQOT_CHECKLIST_INSTANCE 
      WHERE TPQOT_CHECKLIST_INSTANCE.CHECKLIST_CLASS_ID='1257877670188' AND 
      TPQOT_CHECKLIST_INSTANCE.CALC_ID=CALCID AND 
      TPQOT_CHECKLIST_INSTANCE.CALC_REV=CALCREV) ) AS OPC_STATE, 
     (SELECT phonebook.lname FROM phonebook WHERE phonebook.badge = xtbl463Calc.CalcOriginator) AS OrigName, 
     (SELECT phonebook.lname FROM phonebook WHERE phonebook.badge = xtbl463Calc.CalcChecker) AS CheckName, 
     (SELECT phonebook.lname FROM phonebook WHERE phonebook.badge = xtbl463Calc.CalcReviewer) AS ReviewName, 
     (SELECT phonebook.lname FROM phonebook WHERE phonebook.badge = xtbl463Calc.CalcApprover) AS ApproveName 
     FROM xtbl463Calc ORDER BY CALCID; 

該查詢的結果集進入hashmaps數組列表併發送到我的視圖。我應該繼續使用這種4表方法嗎?我是否需要重構我的查詢?我想,一旦我編寫了代表各種清單的所有javabean模型,我就可以清理乾淨。在這個重構工作中,我只想讓自己走在正確的道路上。

回答

0

我看不出表結構有太多錯誤,如果我正確理解了你的描述,它就會存儲它應該存儲的結構。

另一方面查詢看起來太複雜了。

在查詢中有很多查詢iwthin查詢,這是不可能的。我可以在這裏看到三個選項:

  1. 檢查您是否需要此查詢。你真的必須同時顯示所有內容的詳細狀態嗎?
  2. 檢查是否可以以某種方式簡化查詢,刪除或合併其中的某些部分,用連接替換內部選擇,任何事情。查詢中有相當多的重複,所以它可以絕對簡化。
  3. 將查詢分解爲若干個逐個執行的較小查詢。例如,查詢的電話簿部分幾乎肯定可以與主查詢分開運行。

對於選項2和3,子選項是考慮使用視圖。

最後,存在將結果放入hashmaps列表的問題。我顯然不知道你工作的時間限制,但如果你可以負擔得起的時間,我強烈建議創建POJO來存儲結果,而不是把它們放在散列表中。

+0

對於初學者,我正考慮讓另一個表來存儲最新的實例ID,這樣我就可以消除'SELECT MAX'查詢。重構的一部分是將事情從hashmaps的數組列表中移出,並轉換成POJO或javabean DTO – jeff 2011-01-13 22:27:09

相關問題