2010-10-31 32 views
2

我正在使用Django使用MySQL數據庫進行Web服務。客戶端通過由Django處理的URL與我們的數據庫進行交互。現在我試圖創建一個行爲,每當某個表被修改時自動執行一些檢查/日誌記錄,這自然意味着MySQL觸發器。不過,我也可以在Django中執行表修改的請求處理程序。我不認爲Django已經觸發了支持,所以我不確定哪個更好,通過Django代碼或MySQL觸發器來完成。Django代碼或MySQL觸發器

任何具有這些選項性能知識的人都會關注點什麼?提前致謝!

回答

0

您所描述的內容聽起來像是「更改數據捕獲」給我的。

我覺得權衡可能是這樣的:

  1. Django的優點:中間層的代碼可以被多個應用程序共享;如果數據庫改變
  2. Django的缺點便攜式:按道理不是業務交易的一部分
  3. MySQL優勢:自然做在一個數據庫中
  4. MySQL的缺點:觸發器是非常數據庫特定的;如果你改變供應商,你必須重寫

This可能會有所幫助。

6

有很多的方法來解決你所描述的問題:

  • 應用邏輯
    • 具體查看邏輯 - 如果該行爲是特定於單個查看,然後將更改放入視圖中。
    • 特定於模型的邏輯 - 如果行爲特定於單個模型,則該模型爲override the save() method
  • 中間件邏輯 - 如果該問題涉及到多個模型或需要纏現有的應用程序,你可以使用Django的pre-save/post-save signals添加額外的行爲而無需改變應用程序本身。
  • 數據庫存儲過程 - 通常情況下是可能的,但Django的ORM不使用它們。不可跨數據庫移植。
  • 數據庫觸發器 - 不能從一個數據庫移植到另一個數據庫(或者甚至是一個數據庫的一個版本),但允許您跨多個(可能是非Django)應用程序控制共享行爲。

就個人而言,我更喜歡使用覆蓋save()方法或使用Django信號。使用特定於視圖的邏輯可以在大型應用程序中捕捉到具有相同模型的多個視圖。

+1

隨着我自己的應用程序,我一直這樣做,因爲代碼最終以易於理解的格式在模型旁邊結束。信號非常適合第三方/ django核心事件。 – 2010-10-31 04:33:49