2008-11-01 47 views
12

在網絡服務器或數據庫上運行函數通常更好嗎?mysql或php中的函數

如: INSERT INTO例子(散)值(MD5( '你好'))

INSERT INTO例子(散)VALUE( '5d41402abc4b2a76b9719d911017c592')

好了,所以這是一個非常一個簡單的例子,但是當一個網站發展到多個網站或數據庫服務器時,爲了實現可擴展性,最好是「做這項工作」在哪裏?

回答

12

我嘗試將數據庫視爲僅保留內容的地方,並將所有抽象代碼放在其他地方。數據庫表達式已經足夠複雜了,而無需向它們添加函數

而且,查詢優化器將任何表情絆倒與功能,如果你曾經最終想要做這樣的事情「選擇.... WHERE MD5(XXX)= ...」

和數據庫功能一般來說不是很便攜。

2

就我個人而言,我嘗試使用Insert,Update,Delete來保持數據庫簡單(至少),而沒有太多可用於代碼的函數。 Stored Proc是相同的,只包含非常接近持久性數據而非業務邏輯相關的任務。

我會把MD5放在外面。這會讓met在數據庫的存儲範圍之外有這個「數據操作」。

但是,你的榜樣是很「簡單」,我不覺得這是不好把它裏面......

0

我想大多數的時候,你會想離開這個數據操縱web服務器,但是,如果你想處理關於表,關係等的數據庫,那麼去數據庫。

我個人遊說我的公司將我們的MySQL服務器升級到5.0,以便我可以開始利用程序(這正在殺死我們管理的幾個站點)。

3

只要需要這樣的計算,我就嘗試在腳本語言中使用函數。出於各種原因,我將SQL函數的用處降到最低。

主要原因是我的一個SQL數據庫負責託管多個網站。如果SQL服務器因一個站點的請求而陷入停滯狀態,則會對其他站點產生不利影響。例如,考慮您是否在共享服務器上工作,這一點尤爲重要,但在這種情況下,您幾乎無法控制其他用戶正在做什麼。

次要原因是我喜歡我的SQL代碼儘可能便攜。我甚至不想嘗試來計算存在的不同風格的SQL,所以我嘗試將函數(特別是非標準擴展)保留在我的SQL代碼之外,但SUM或MIN/MAX之類的東西除外。

我猜我的意思是,SQL旨在存儲和檢索數據,它應該保持這一目的。使用您選擇的服務語言預先執行任何計算,並保持SQL代碼的可移植性。

2

使用您的數據庫作爲持久性和維護數據完整性的手段。並將業務邏輯放在它之外。

如果您將業務邏輯中的任何一項都放到數據庫中,那麼您將使其日後的管理和維護變得更加複雜。

0

與其他答案一樣,我更願意將所有的業務邏輯放在一個地方。也就是我的應用語言。 (更具體地說,在對象模型中,如果存在一個,但不是所有代碼都是OO)。

但是,如果您在有關是否使用內聯SQL或存儲過程的(my)sql標記問題查看StackOverflow ,你會發現大多數響應這些數據的人都強烈支持隨時隨地使用存儲過程,即使是最微不足道的查詢。你可能想看看其中的一些問題,看看一些有利於其他方法的論點。