我已經開發了一個帶有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模型,我就可以清理乾淨。在這個重構工作中,我只想讓自己走在正確的道路上。
對於初學者,我正考慮讓另一個表來存儲最新的實例ID,這樣我就可以消除'SELECT MAX'查詢。重構的一部分是將事情從hashmaps的數組列表中移出,並轉換成POJO或javabean DTO – jeff 2011-01-13 22:27:09