2011-07-14 34 views
3

我們應該在數據庫中做多少工作? 好吧我真的很困惑,到底應該在數據庫中完成多少「工作」,以及在應用程序級別需要完成多少工作?我們應該在數據庫中做多少工作?

我的意思是我說的不是很明顯這樣的東西,我們應該將字符串轉換成散列SHA2在應用程序級別而不是數據庫級別..

反倒是的東西,更模糊,包括但不限到「我們是否應該檢索4列的數據並在應用程序級別進行大寫/連接,還是應該在數據庫級別執行這些操作並將計算結果發送到應用程序級別?

如果您可以列出還有其他的例子會很棒

+1

做數據庫中的'數據庫工作';即有效地選擇和存儲數據。 –

回答

0

一般來說,它是一個很好的p ractice僅預期來自數據庫的「Data」。它取決於應用程序,應用商業/域邏輯並理解檢索的數據。其強烈建議做以下事情中的應用層:

1)格式日期 2)應用數學函數,諸如內插/外插等 3)動態排序(基於列)

然而,有時需要在數據庫級別完成一些事情。

0

在我看來,應用程序應該使用數據和數據庫應該提供它們,並且應該明確地分離關注點。因此,數據庫會根據請求的條件對記錄進行排序,排序和過濾,但是應用程序會將某些業務邏輯應用於該記錄,並將它們「轉換」爲對用戶有意義的內容。

例如,在我以前的公司,我們曾在大量的工作時間計算應用程序上工作。這種應用程序的一個顯而易見的功能是跟蹤員工休假天數 - 員工每年有多少天,他使用了多少人,剩下多少人,等等。基本上我們可以編寫一些觸發器和程序來自動更新這些列。因此,當員工在假期時間內批准了他申請的天數時,他會從他的「假期游泳池」中獲取並添加到「休假日」中。相當容易的東西,但我們決定在應用程序級別和男孩中明確表示,很快我們很高興我們這樣做了。申請必須符合勞動法的規定,並且很快就會發現,並非所有員工的休假日都是平等計算的,有時候休假日根本就不是休假日,除了這一點外。如果我們把這個「簡單」的操作放到數據庫中,我們必須對數據庫進行版本更新,以便對假期相關的邏輯進行一點點改變,並且這會導致我們直接在客戶支持領域陷入困境,因爲事實上可能只更新應用程序而不需要更新數據庫(當然,除了明確的「突破」時刻,其中數據庫結構發生了變化)。

4

這真的取決於你需要什麼。
我喜歡在數據庫中做我的業務邏輯,其他人則反對這種做法。

您可以在SQL中使用觸發器和存儲過程/函數。

鏈接爲MySQL:
http://dev.mysql.com/doc/refman/5.5/en/triggers.html
http://www.mysqltutorial.org/introduction-to-sql-stored-procedures.aspx
http://dev.mysql.com/doc/refman/5.5/en/stored-routines.html

我這樣做觸發器中的業務邏輯的理由和存儲理線

請注意,我不是在談論彎曲數據庫結構走向業務邏輯,我正在談論把業務邏輯放在觸發器中並存儲起來程序。

  1. 它集中你的邏輯,數據庫是一箇中心位置,一切都必須經過它。如果您的應用中有多個插入/更新/刪除點(或者您有多個應用),則需要多次執行檢查,如果您在數據庫中執行檢查,則只需在一個位置執行檢查。
  2. 它簡化了應用程序例如,您只需添加一個成員,數據庫就會知道該成員是否已知並採取了相應的操作。
  3. 它從應用程序隱藏數據庫的內部結構,如果您在應用程序中執行所有邏輯,則需要在應用程序中使用複雜的數據庫知識。如果您使用數據庫代碼(觸發器/ procs)來隱藏它,則不需要知道應用程序中的每個數據庫詳細信息。
  4. 它使恢復數據庫變得更容易如果您的數據庫中有邏輯,您可以更改表格佈局,用黑洞表替換舊錶,並在其上放置觸發器並讓觸發器執行更新對於新表格,您的應用程序甚至不需要知道數據庫已更改,這可以使舊版應用程序保持不變,而新應用程序可以使用改進的數據庫版式。
  5. 有些事情更容易在SQL
  6. 有些東西在工作更快SQL
  7. 我不喜歡用(大量的和/或複雜)的SQL代碼在我的應用,我喜歡將SQL代碼放入存儲過程/函數中,並嘗試僅將簡單查詢放入應用程序代碼中,這樣我就可以編寫代碼來解釋我的應用程序中的含義,並讓數據庫層完成繁重的工作。

有些人對此非常不同意,但這種方法對我很好,並且簡化了我的應用程序的調試和維護。

0

根據我的經驗,我發現很多應用程序都以一組簡單的表開始,然後使用少量存儲過程來提供基本功能。這很好,它通常產生高性能並且易於理解,同時也減輕了對複雜中間層的任何需求。

但是,應用程序的增長。看到有數千個存儲過程的大型數據驅動應用程序並不罕見。將觸發器加入混合中,並且對於除原始開發人員以外的任何人(如果他們仍在處理它),您都有一個應用程序,這是非常難以維護的。

我會放話在應用哪個地方最數據庫中的邏輯 - 他們可以很好地工作,當你有一些很好的數據庫開發人員和/或你不能改變一個傳統的模式。我這樣說的原因是,當你讓他們控制模式時,ORM會從應用程序開發的這一部分中消除很多痛苦(如果不是,你經常需要做很多工作才能使它工作)。

如果我設計一個新的應用程序,然後我通常會選擇由我的應用領域決定的模式(其設計將是代碼)。我通常會讓ORM處理對象和數據庫之間的映射。當涉及到數據訪問時,我會將存儲過程視爲規則的例外(與使用ORM來有效生成複雜輸出相比,報告在sprocs中更容易)。

要記住,雖然最重要的一點,是沒有「最佳實踐」,當談到設計。開發人員可以根據您的設計權衡各個選項的優缺點。

相關問題