簡體   English   中英

Java Web應用程序和數據庫設計

[英]Java web application & database design

我已經開發了一個帶有Oracle后端的Java工作流Web應用程序。 該工作流程要求用戶填寫一系列清單。
我使用每個檢查表2個表開始了該項目-一個表用於存儲問題,另一個表用於存儲答案。

但是管理層一直在要求更多清單,因此我更改了數據庫方法(如下)。 我想知道這種方法是否很好,或者我正在為以后的麻煩做准備。 我正在重構整個應用程序,因為它沒有遵循MVC方法。 現在是糾正任何數據庫設計問題的時候了。

這是我的新方法:

表格:

CHECKLIST_CLASS存儲CHECKLIST_CLASS類型,即質量審核清單,過程審核清單
CHECKLIST_INSTANCE正在使用的用戶清單。 存儲checklist_class_id,work_flow_id的FK
CHECKLIST_ANSWER存儲check_list_instance_id,question_id的FK,多選答案
CHECKLIST_QUESTION存儲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;

該查詢的結果集進入哈希表的數組列表,並發送到我的視圖。 我應該繼續使用這種四表方法嗎? 我需要重構查詢嗎? 我認為,一旦我編寫了代表各種清單的所有javabean模型,就可以清理工作。 我只想感覺自己在進行重構工作時走上了正確的道路。

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

另一方面,查詢看起來確實太復雜了。

在查詢中,有很多查詢是不正確的。 我可以看到三個選項在這里打開:

  1. 檢查是否完全需要此查詢。 您是否真的必須同時顯示所有內容的詳細狀態?
  2. 檢查是否可以某種方式簡化查詢,消除或合並查詢的一部分,用聯接替換內部選擇等。 查詢中有很多重復,因此可以肯定地簡化它。
  3. 將查詢細分為幾個較小的查詢,一個接一個地執行。 例如,查詢的電話簿部分幾乎可以肯定與主查詢分開運行。

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

最后,存在將結果放入哈希表列表中的問題。 我顯然不知道您在什么時間范圍內工作,但是如果您有時間的話,我強烈建議您創建POJO來存儲結果,而不是將它們放在哈希圖中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM