2011-08-10 212 views
1

我討厭再次提出「數據庫與代碼中的業務邏輯」這個經典問題,但我需要一些具體的理由來說服一個老的開發團隊,他們認爲代碼中的業務邏輯更好,因爲它更多可維護,高於一切。我曾經在數據庫中有很多業務邏輯,因爲我相信這是單點訪問。如果我是唯一一個改變它的人,維護很容易。根據我的經驗,當項目變得越來越大和複雜時,問題就出現了。數據庫存儲過程的源代碼控制並不像新IDE那樣先進,編輯也沒有。代碼中的業務邏輯可以比數據庫更好地擴展,這是我在最近的經驗中發現的。數據庫層中的業務邏輯

所以,就在計算器搜索,我發現從它的尊貴會員完全相反的理念:

https://stackoverflow.com/search?q=business+logic+in+database

我知道沒有絕對的任何情況,但對於給定的asp.net的解決方案,這將使用sql服務器或oracle,爲一個不是特別高的流量站點,爲什麼我會把邏輯放在數據庫中?

回答

6

取決於你所謂的業務。

數據庫應該做預期的工作。

如果消費者和數據提供者期望數據庫做出某些保證,那麼它需要在數據庫中完成。

有些人不在數據庫中使用參照完整性,並期望系統的其他部分管理它。有些人直接訪問數據庫中的表。

我覺得從系統和組件的角度來看,數據庫就像任何其他服務或類/對象一樣。它需要保護它的邊界,隱藏其實施細節,並提供完整性保證,從低級完整性到可能被認爲是「商業」的某個級別。

好辦法做到這一點是引用完整性,存儲過程,觸發器(在必要時),視圖,隱藏基表,等等等等

+0

感謝您的回答 - 雖然我的意思是業務邏輯,但我更多地指的是非常具體的業務邏輯,例如「該員工是否允許爲該部門增加費用」......參考完整性和觸發器可以幫助我保護孤立的數據和保存外鍵,但它不會幫助我做像我提到的檢查。哪裏應該這樣? –

+1

@Cade我完全同意你的看法,只不過如果你隱藏太多或者做了太多的視圖,Sprocs很容易變得幾乎不可管理。我已經看到重構視圖之上的視圖和用於管理一切的存儲過程的情況。好的設計可能會阻止很多這種情況,這就是爲什麼三層和n層架構被髮明出來的原因。嘗試並避免很多這些問題。 –

+1

@ M.R。關於員工和部門的情況很可能是數據庫外部的情況。另一方面,如果可能有多個應用程序可能正在執行插入操作(例如來自SSIS包的訂單,Web前端和Windows服務),則很可能您希望數據庫執行該操作,或者通過某種應用程序服務器或Web服務強制所有用戶。 –

1

數據庫處理數據的事情,爲什麼要衡量一些已經非常難以提供數據的東西。這是一個性能和代碼的事情。維護業務邏輯代碼比將其全部存儲在數據庫中要容易得多。 Sprocs,視圖和函數只能運行到目前爲止,直到你有視圖視圖與sprocs填補混亂英寸與業務邏輯,你分開你的憂慮。如果你有一個導致錯誤計算的錯誤,檢查業務邏輯代碼比進入數據庫更容易,看看是否有人在Stored Procedure中搞砸了某些東西。這是非常有見地的,在某些情況下可以在數據庫中放入一些邏輯,但是我的想法是它是一個數據庫而不是邏輯庫,把它放在他們所屬的地方。

P.S:可能會爲這篇文章吸引一些熱度,它的評價很高,除了表現數字之外,沒有任何實際的證據,它會成爲您正在使用的內容。

編輯:凱德提到我忘了的東西。充分的完整性。通過一切手段,請在你的數據庫中有正確的數據完整性,沒有孤立的記錄ON DELETE CASCADE的,檢查和什麼。

+0

是的,我知道:)。當數據庫比框架執行速度快得多時,整個'數據庫中的業務邏輯'是一個較老的哲學(或者我認爲)。今天的框架更好,更快,更靈活,更具可擴展性,所以我不認爲這種哲學佔上風。但我在stackoverflow上的搜索似乎表明,否則...... –

+0

@ M.R。我自己有點震驚。我已經在許多地方完成了性能測試,以阻止這種做法,因爲它正在讓數據庫陷入困境,從而在那裏做了很多邏輯。 .NET框架(現在非常流行)非常快,因爲PHP非常常用於DB後端。沒有理由真的把更多的工作放到數據庫上(至少我是這麼認爲的)。 –

+3

我還會注意到許多「開發人員」實際上並不擅長編寫SQL。因此,他們放在數據庫中的「邏輯」可能表現不佳,他們將這歸咎於數據庫而不是他們使用的技術。過度使用觸發器,幾乎所有遊標的使用,由於誤解可控性而引起的低效查詢,以及基本的索引策略都在這裏起作用。 –

-1

我都面臨着數據庫邏輯上的大型項目之一。這是由主要經理誰是DBA專家的決定造成的。他說應用程序應該是輕量級的,它對數據庫方案,連接表等應該一無所知,並且無論如何,存儲Procs的執行速度要比客戶端的事務範圍和查詢快得多。 另一方面,我們有太多的數據庫對象映射錯誤(基於其他視圖的基於視圖的存儲prod或視圖等)。無法理解我們的數據正在發生什麼,因爲每次點擊按鈕都會調用70-90-120個參數的巨大存儲過程並更新幾個(10-15)表。我們沒有能力去查詢簡單的select請求,所以我們不得不編譯一個視圖或者在代碼中存儲Proc和類,只是爲了一個簡單的連接:-(當然,當表或視圖定義改變時,你應該重新編譯所有其他基於dB的對象在編輯的對象上你會得到運行時異常 所以我認爲數據庫中的邏輯是一種可怕的方式當然,如果需要性能或安全問題,你可以在存儲過程中存儲一些代碼片段,但是你不能開發一切數據庫)邏輯應該是靈活的,可測試和可維護的,並且你不能使用數據庫來存儲邏輯的這一點)