2017-06-21 22 views
1

我在我的應用程序(Django/Rest Framewrok)中有這個數據模型。它主要列出並運行於項目版本類,其中每個系統有多個實例受影響,每個實例有多個階段有不同的努力。在數據庫中是否具有預先計算的字段以避免深度連接查詢是一個壞主意?

我開發一個前端一個RESTful API,並列出所有項目爲一個發行時,我遇到了加載時間的麻煩,或者所有的活動項目。我需要進入ProjectInstancePhase以獲得Project o Release元素的全部工作。

對更新依賴對象時更新的Project或Release對象是否具有預先計算的值是一個壞主意?我知道它打破了數據庫的規範化,但它會節省很多時間。考慮列出所有相關數據的300個項目。

我想過緩存,但我需要經常使其無效,因爲需要顯示相關類的任何更改。

是否有一些ORM技巧來降低數據庫的負載?

所有的教程和示例通常都依賴於很少反映真實生活複雜項目的簡單數據模型,所以我沒有在其中找到這個主題。

非常感謝。

         *Listed    *Listed 
+--------+  +------------+  +-----------+   +----------+ 
| Person +>-----<+ Participant+>----<+ Project +>-------<+ Release | 
+--------+  +------------+  +-----------+   +----------+ 
              v 
             ^
       +--------+  +-----------------+ 
       | System +>----<+ ProjectInstance | 
       +--------+  +-----------------+ 
              v 
             ^
           +----------------------+  +--------------+ 
           | ProjectInstancePhase +>------<+ ProjectPhase | 
           +----------------------+  +--------------+ 
             *Effort 
+1

Denormalisation是一個完全有效的技術,只要它是謹慎使用,正確的原因。最棘手的部分是確保在值保持同步 –

+0

是的,我開發了一個Mixin來檢查sav之前所選字段的更改因此我可以更新相關字段。 – jmoreno

回答

1

我很經常使用這種方法。您可以使用Django的信號來更新預先計算的字段(甚至是某些專用模型的預先計算的實例)。

而且,你甚至可以只執行特定情況下,某些更新(例如,現場a改變了它從正數到負等價值 - 在重寫.save()方法有可能有更新前訪問所有實例字段值並更新後他們的值進行比較。

讓我知道,如果你需要的例子。

+1

謝謝。我會用這種方法,但是用Mixin來檢查特定字段的變化。當我需要爲某些模型選擇整個樹時,我還必須使用prefetch_related和select_related查看優化。 – jmoreno

相關問題