自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

把業(yè)務(wù)邏輯寫入應(yīng)用程序,而不是數(shù)據(jù)庫

數(shù)據(jù)庫 其他數(shù)據(jù)庫
在執(zhí)行數(shù)據(jù)插入之前,不必驗(yàn)證所插入的數(shù)據(jù)是否有效、無沖突且在應(yīng)用程序中完全正確,而是讓數(shù)據(jù)庫執(zhí)行驗(yàn)證,將沖突標(biāo)準(zhǔn)放入數(shù)據(jù)庫模式需求中,并讓數(shù)據(jù)庫在插入的數(shù)據(jù)中拋出錯誤。

我們都有過這樣的經(jīng)歷,從SQL數(shù)據(jù)庫中提取數(shù)據(jù),而需要提取數(shù)據(jù)的查詢是一個復(fù)雜的查詢,有多個表連接、過濾條件和復(fù)雜的WHERE語句。像MySQL和PostgreSQL這樣的數(shù)據(jù)庫,非常擅長執(zhí)行復(fù)雜的連接、過濾和排序,以便從查詢中準(zhǔn)確獲得所需的數(shù)據(jù)。

如果在數(shù)據(jù)庫中執(zhí)行這些操作,所做的實(shí)際上是將業(yè)務(wù)邏輯從應(yīng)用程序里抽出,并將其移到數(shù)據(jù)庫邏輯當(dāng)中。最終你會使用更多的數(shù)據(jù)庫資源和更少的應(yīng)用服務(wù)器資源,來實(shí)現(xiàn)所期望的數(shù)據(jù)檢索結(jié)果。

在實(shí)現(xiàn)數(shù)據(jù)插入要求時,也是如此。在執(zhí)行數(shù)據(jù)插入之前,不必驗(yàn)證所插入的數(shù)據(jù)是否有效、無沖突且在應(yīng)用程序中完全正確,而是讓數(shù)據(jù)庫執(zhí)行驗(yàn)證,將沖突標(biāo)準(zhǔn)放入數(shù)據(jù)庫模式需求中,并讓數(shù)據(jù)庫在插入的數(shù)據(jù)中拋出錯誤。

[[436927]]

應(yīng)用程序資源更容易擴(kuò)展

在某些情況下,你需要數(shù)據(jù)庫做這些類型的驗(yàn)證和檢查。并不是說,不要讓你的數(shù)據(jù)庫做任何應(yīng)用邏輯。而是,應(yīng)該讓數(shù)據(jù)庫盡可能少地做應(yīng)用業(yè)務(wù)邏輯,盡可能多地在應(yīng)用程序代碼本身中執(zhí)行應(yīng)用業(yè)務(wù)邏輯。

一般來說,擴(kuò)展應(yīng)用服務(wù)器資源比擴(kuò)展數(shù)據(jù)庫服務(wù)器資源要容易得多。

對于大多數(shù)網(wǎng)絡(luò)應(yīng)用程序而言,當(dāng)流量增加時,通??梢暂p松地增加應(yīng)用服務(wù)器,來處理增加的負(fù)載。但是,除非數(shù)據(jù)庫也能擴(kuò)展到處理增加的負(fù)載,否則額外的應(yīng)用服務(wù)器并沒有什么幫助。

觀察應(yīng)用程序的可用資源。您應(yīng)該將數(shù)據(jù)庫看作是由稀缺的計(jì)算資源組成的,而應(yīng)用程序代碼層(包括服務(wù))是由隨時可用的計(jì)算資源組成的,這些計(jì)算資源可以很容易地?cái)U(kuò)展。

數(shù)據(jù)庫資源是稀缺的,計(jì)算資源隨時可用。

一旦你能理解這種思維方式,你就會意識到在應(yīng)用程序?qū)又校胖帽M可能多的邏輯,將有助于更容易地?cái)U(kuò)展。而將業(yè)務(wù)邏輯放在數(shù)據(jù)庫層會極大地限制該業(yè)務(wù)邏輯的可伸縮性。

讓數(shù)據(jù)庫處理復(fù)雜的過濾問題

不可能總是把所有的業(yè)務(wù)邏輯放在應(yīng)用層。有時,你必須把某些查詢放在數(shù)據(jù)庫里。這樣做的一個有效原因,可能是為了控制返回結(jié)果的數(shù)量。假設(shè)一個查詢在一個非常大的數(shù)據(jù)庫表上有一個復(fù)雜的過濾條件:


在大型數(shù)據(jù)集上,執(zhí)行復(fù)雜的過濾查詢后,預(yù)期的結(jié)果可能只有表中的幾條記錄。*將從這幾行返回所有數(shù)據(jù)。但是,如果希望在應(yīng)用層,而不是數(shù)據(jù)庫中,執(zhí)行復(fù)雜的過濾查詢,則通常需要先從數(shù)據(jù)庫中檢索所有的數(shù)據(jù)。你最終可能會出現(xiàn)這樣的結(jié)果:


這將把mytable中所有數(shù)據(jù)返回給應(yīng)用層。然后,應(yīng)用層將扔掉任何沒有通過它在數(shù)據(jù)上執(zhí)行的過濾條件的行。這樣做的問題是,為了執(zhí)行這個需求,mytable的全部內(nèi)容都必須被轉(zhuǎn)移到應(yīng)用層。對于大型數(shù)據(jù)集來說,這是不可接受的。

在許多情況下,簡單地重構(gòu)一個查詢或一系列查詢,可以避免此類問題,并允許你在應(yīng)用程序中執(zhí)行更多的邏輯,而不會產(chǎn)生不必要的數(shù)據(jù)流量。做到這一點(diǎn)的一個方法是將數(shù)據(jù)過濾與數(shù)據(jù)檢索分離開來。

過濾與檢索分離

我們經(jīng)常把過濾結(jié)果和檢索結(jié)果的概念合并到單個查詢中。特別是當(dāng)我們查看有很多數(shù)據(jù)的大表時,編寫一個查詢,執(zhí)行所有的過濾和規(guī)范,選擇我們需要的行,然后讓查詢從選擇的行中,返回需要的所有數(shù)據(jù),這是非常方便的。


就其本身而言,這似乎沒什么問題。但是,當(dāng)查詢涉及到復(fù)雜的連接或其他復(fù)雜的操作時,它就會給數(shù)據(jù)庫帶來不小的負(fù)荷,使數(shù)據(jù)庫資源緊張。

解決這個問題的方法是執(zhí)行一個初始查詢,只簡單地從所有行中返回過濾查詢所需的字段,然后在應(yīng)用程序中執(zhí)行過濾邏輯。讓我們假設(shè)field1和field2是上述<復(fù)雜的過濾查詢>中實(shí)際涉及的字段。所以,讓我們在初始查詢中只獲得這些數(shù)據(jù):


然后,我們可以在你的應(yīng)用程序代碼中對field1和field2執(zhí)行復(fù)雜過濾器查詢邏輯。這將導(dǎo)致我的表格中符合復(fù)雜查詢的行的ID列表。一旦你有了匹配的ID列表,你就可以執(zhí)行后續(xù)的查詢,從預(yù)過濾的行中獲取實(shí)際數(shù)據(jù):


這兩個查詢都是非常簡單的查詢,不需要在數(shù)據(jù)庫中進(jìn)行復(fù)雜的操作。選擇返回?cái)?shù)據(jù)的必要業(yè)務(wù)邏輯是在應(yīng)用層執(zhí)行的,但需要從數(shù)據(jù)庫傳輸?shù)綉?yīng)用的無關(guān)數(shù)據(jù)很少。通過將查詢分割成獨(dú)立的過濾和數(shù)據(jù)檢索查詢,你已經(jīng)重構(gòu)了你的請求,并允許復(fù)雜的、資源密集的業(yè)務(wù)邏輯在應(yīng)用程序中執(zhí)行,而不是數(shù)據(jù)庫。

避免對返回的結(jié)果進(jìn)行操作

將業(yè)務(wù)邏輯從數(shù)據(jù)庫移到應(yīng)用程序?qū)拥牧硪环N簡單方法是避免對數(shù)據(jù)庫中返回的結(jié)果執(zhí)行計(jì)算;而是在應(yīng)用程序中執(zhí)行它們。因此,不要做這樣的事情。


你可以這樣做:


然后,在應(yīng)用程序中對返回的結(jié)果執(zhí)行POWER(SQRT(field1)*SIN(field2),5)的等效計(jì)算。其結(jié)果是,執(zhí)行計(jì)算所需的所有計(jì)算都利用了現(xiàn)成的應(yīng)用程序資源,而不是稀缺的數(shù)據(jù)庫資源。

將連接轉(zhuǎn)移到應(yīng)用層

復(fù)雜的連接是需要大量數(shù)據(jù)庫資源。與其在數(shù)據(jù)庫中連接數(shù)據(jù),不如將盡可能多地連接邏輯轉(zhuǎn)移到應(yīng)用層中。以這種方式重構(gòu)代碼,可以顯著減少數(shù)據(jù)庫的負(fù)載,同時提高可伸縮性。

當(dāng)然,不可能總是以這些方式重構(gòu)查詢。有時,只需要在數(shù)據(jù)庫本身中執(zhí)行一個復(fù)雜的查詢。但是,通過盡可能多地刪除這些復(fù)雜的查詢,你可以減少對稀缺的數(shù)據(jù)庫資源的依賴,增加對高可用的應(yīng)用級資源的依賴。

因此,下次當(dāng)你看到使用多個連接和復(fù)雜過濾邏輯的大型、長且復(fù)雜的查詢時,不要為此感到困難。相反,考慮用更簡單的查詢(可能是多個查詢)和在應(yīng)用程序?qū)又袌?zhí)行的業(yè)務(wù)邏輯替換它的方法。

隨著應(yīng)用程序的擴(kuò)展,你會感受到改進(jìn)的靈活性。

 

責(zé)任編輯:趙寧寧 來源: ITPUB
相關(guān)推薦

2017-08-01 09:16:55

云應(yīng)用程序數(shù)據(jù)

2010-08-12 21:06:00

數(shù)據(jù)庫應(yīng)用程序數(shù)據(jù)庫安全

2010-08-12 21:13:49

數(shù)據(jù)庫安全應(yīng)用程序安全

2020-05-03 12:57:32

數(shù)據(jù)庫DIY管道

2022-10-24 14:21:09

數(shù)據(jù)庫應(yīng)用數(shù)據(jù)庫數(shù)據(jù)管理

2021-02-23 23:06:31

數(shù)據(jù)庫Redis技術(shù)

2010-07-14 13:14:01

SQL Server數(shù)

2022-05-10 08:00:00

數(shù)據(jù)庫數(shù)據(jù)庫監(jiān)控監(jiān)控系統(tǒng)

2011-03-30 11:15:35

SQL Server數(shù)應(yīng)用程序

2011-07-21 09:07:16

ADO.NET

2023-12-29 22:39:25

Golang應(yīng)用程序數(shù)據(jù)庫

2018-01-24 20:42:06

數(shù)據(jù)庫NoSQL驅(qū)動力

2022-11-02 08:00:00

數(shù)據(jù)庫多區(qū)域應(yīng)用程序云平臺

2009-10-13 15:07:43

2011-03-31 10:18:42

SQL Server數(shù)據(jù)體系應(yīng)用程序邏輯

2017-10-31 14:49:12

2011-03-21 14:27:15

數(shù)據(jù)庫優(yōu)化業(yè)務(wù)邏輯設(shè)計(jì)

2010-04-14 15:30:41

Oracle數(shù)據(jù)庫

2013-11-04 10:16:43

SAP中國商業(yè)同略會SAP HANA

2013-04-01 09:59:59

VS2010
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號