簡介
資料庫是許多現代應用程式和工具的基本組件。身為使用者,您每天可能會與數十甚至數百個資料庫互動,當您瀏覽網站、使用手機上的應用程式或在雜貨店購買商品時。身為開發人員,資料庫是用於持久保存資料的核心組件,使其超出應用程式的生命週期。但資料庫究竟是什麼?為什麼它們如此常見?
在本文中,我們將探討
- 什麼是資料庫
- 人們和應用程式如何使用它們來追蹤各種資料
- 資料庫提供哪些功能
- 它們做出哪些類型的保證
- 它們與其他資料儲存方法相比如何
最後,我們將討論應用程式如何依賴資料庫來儲存和檢索資料,以實現複雜的功能。
什麼是資料庫?
資料庫是用於組織和儲存資料以供未來處理、檢索或評估的邏輯結構。在電腦的環境中,這些結構幾乎總是透過稱為資料庫管理系統或 DBMS 的應用程式來管理。DBMS 管理電腦磁碟上的專用檔案,並為使用者和應用程式提供邏輯介面。
資料庫管理系統通常設計為根據特定模式組織資料。這些模式稱為資料庫類型 或資料庫模型,是決定如何儲存和管理個別資料片段的邏輯和結構基礎。資料庫類型有很多種,每種都有其優點和限制。關聯式模型將資料組織成交叉引用的表格、列和欄,通常被認為是預設的範例。
DBMS 可以透過多種方式使它們管理的資料庫可存取,包括命令列用戶端、API、程式設計函式庫和管理介面。透過這些管道,資料可以被擷取到系統中、根據需要組織,並在請求時傳回。
資料持久性與臨時儲存
資料庫將資料儲存在磁碟或記憶體中。
磁碟儲存通常被稱為持久性,這意味著資料被可靠地儲存起來以供稍後使用,即使資料庫應用程式或電腦本身重新啟動也是如此。
相反地,記憶體儲存被稱為臨時性或揮發性。臨時儲存無法在應用程式或系統關閉後倖存。記憶體資料庫的優點是它們通常非常快速。
實際上,許多環境會混合使用這兩種系統類型,以獲得每種類型的優點。對於接受對臨時層的新寫入的系統,可以透過定期將臨時資料儲存到磁碟來完成此操作。其他系統使用持久性資料的唯讀記憶體副本來加速讀取存取。這些系統可以隨時從後端儲存重新載入資料以刷新其資料。
後端儲存類型 | 資料在重新啟動後會保留嗎? | 優點 | 範例 |
---|---|---|---|
磁碟上 | 是 | 資料持久性 | MySQL |
記憶體中 | 否 | 運作速度 | memcached |
與資料庫互動以管理您的資料
雖然資料庫系統負責如何將資料儲存在磁碟或記憶體中,但它也為使用者或應用程式提供介面。資料庫的介面必須能夠表示外部方可以執行的操作,並且必須能夠表示系統支援的所有資料類型。
根據維基百科,資料庫通常允許以下四種類型的互動
- 資料定義:建立、修改和移除資料結構的定義。這些操作會變更影響資料庫如何接受和儲存資料的屬性。這在某些類型的資料庫中比其他資料庫更重要。
- 更新:在資料庫中插入、修改和刪除資料。這些操作會變更正在管理的實際資料。
- 檢索:提供對已儲存資料的存取。資料可以按原樣檢索,或經常可以篩選或轉換以將其轉換為更有用的格式。許多資料庫系統理解豐富的查詢語言來實現這一點。
- 管理:其他任務,例如使用者管理、安全性、效能監控等,這些任務是必要的,但與資料本身沒有直接關係。
讓我們在下面更詳細地介紹這些內容。
資料定義控制系統內資料的形狀和結構
建立和控制資料在資料庫中採用的結構是資料庫管理的重要組成部分。這可以幫助您在將資料擷取到系統之前控制資料的形狀或結構。它還允許您設定約束,以確保您的資料符合某些參數。
在對高度規則的資料進行操作的資料庫(如關聯式資料庫)中,這些定義通常稱為資料庫的綱要。資料庫綱要是資料必須格式化才能被特定資料庫接受的嚴格輪廓。這涵蓋了個別記錄中必須存在的特定欄位,以及對值(例如資料類型、欄位長度、最小值或最大值等)的要求。資料庫綱要是資料庫擁有者影響和控制將儲存在系統中的資料的最重要工具之一。
重視靈活性而非規則性的資料庫管理系統通常被稱為無綱要資料庫。雖然這似乎暗示儲存在這些資料庫中的資料沒有結構,但通常情況並非如此。相反,資料庫的結構由資料本身以及應用程式對資料的了解和關係決定。資料庫通常仍然遵循結構,但資料庫管理系統較少參與強制執行約束。這是一種設計選擇,在不同情況下有其優點和缺點。
資料更新以擷取、修改和移除系統中的資料
資料更新包括任何以下操作
- 將新資料輸入系統
- 修改現有條目
- 從資料庫中刪除條目
這些功能對於任何資料庫都是必不可少的,並且在許多情況下,構成資料庫系統處理的大部分操作。這些類型的活動(導致系統中資料變更的操作)統稱為寫入 操作。
寫入操作對於任何隨時間變更的資料來源都很重要。即使是刪除資料這種破壞性操作,也被視為寫入操作,因為它修改了系統內的資料。
由於寫入操作可能會變更資料,因此這些操作可能很危險。大多數資料庫管理員將其系統配置為將寫入操作限制為某些應用程式程序,以最大程度地減少意外或惡意資料損壞的機會。例如,資料分析使用現有資料來回答有關網站效能或訪客行為的問題,只需要讀取權限。另一方面,記錄使用者訂單的應用程式部分需要能夠將新資料寫入資料庫。
檢索資料以提取資訊或回答特定問題
除非您可以檢索它,否則儲存資料不是很有用。由於傳回資料不會影響目前儲存在資料庫中的任何資訊,因此這些操作稱為讀取 操作。讀取操作是收集已儲存在資料庫中的資料的主要方式。
資料庫管理系統幾乎總是有一種直接的方式,透過唯一識別碼(通常稱為主鍵)存取資料。這允許透過提供金鑰來存取任何一個條目。
許多系統還具有複雜的查詢資料庫方法,以傳回符合特定條件的資料集或傳回有關條目的部分資訊。這種查詢靈活性有助於資料庫管理系統除了基本的資料儲存功能外,還可以作為資料處理器運作。透過開發特定的查詢,使用者可以提示資料庫系統僅傳回他們需要的資訊。此功能通常與寫入操作結合使用,以按屬性查找和修改特定記錄。
管理資料庫系統以保持一切順利運作
資料庫經常支援的最後一類操作是管理功能。這是一個廣泛、通用的操作類別,有助於支援資料庫環境,而不會直接影響資料本身。可能屬於此組的一些項目包括
- 管理使用者、權限、身份驗證和授權
- 設定和維護備份
- 配置儲存的後端媒體
- 管理複寫和其他擴展考量
- 提供線上和離線復原選項
這組操作與任何現代應用程式常見的基本管理問題一致。
管理操作可能不是核心資料管理功能的中心,但這些功能通常使相似的資料庫管理系統脫穎而出。能夠輕鬆備份和還原資料、實作連接到現有系統的使用者管理,或擴展您的資料庫以滿足需求,這些都是在生產環境中運作的基本功能。未能關注這些領域的資料庫通常難以在真實世界環境中獲得採用。
資料庫有哪些職責?
鑑於上述描述,我們如何概括資料庫的主要職責?答案在很大程度上取決於正在使用的資料庫類型以及應用程式的需求。即便如此,所有資料庫都力求提供一組共同的職責。
透過忠實記錄和重組來維護資料完整性
資料完整性是資料庫系統的基本要求,無論其用途或設計如何。載入到資料庫中的資料應能夠可靠地檢索,而不會發生意外的修改、操縱或刪除。這需要可靠的載入和檢索資料的方法,以及在物理媒體上儲存資料時必要的序列化和反序列化。
資料庫經常依賴諸如校驗和之類的功能來驗證寫入或檢索的資料,或者使用諸如預寫式日誌等技術來防止意外關閉引起的問題。資料儲存越分散,資料完整性就越具挑戰性,因為系統的每個部分都必須反映每個資料項目的當前所需狀態。這通常是透過更嚴格的要求和來自多個成員的回應來實現的,無論何時系統中的資料發生變更。
提供滿足部署環境需求的效能
資料庫必須執行得足夠好才能有用。您需要的效能特性在很大程度上取決於應用程式的特定需求。每個環境都有獨特的讀取和寫入請求平衡,您將必須決定對這兩種類別而言可接受的效能意味著什麼。
資料庫通常更擅長執行某些類型的操作,而不是其他操作。操作效能特性通常反映資料庫的類型、資料綱要或結構以及操作本身。在某些情況下,諸如索引之類的功能(它會為常用存取的資料建立替代的效能最佳化儲存)可以為這些項目提供更快的檢索速度。其他時候,資料庫可能只是不適合所請求的存取模式。在決定您需要的資料庫類型時,這是需要考慮的事情。
設定程序以允許安全並行存取
雖然這不是嚴格的要求,但實際上,資料庫必須允許並行存取。這意味著多方必須能夠同時使用資料庫。記錄應該可以由任意數量的使用者同時讀取,並且在目前未被其他使用者鎖定時可以寫入。
並行存取通常意味著資料庫必須實作一些其他基本功能,例如使用者帳戶、權限系統以及身份驗證和授權機制。它還必須制定策略,以防止多個使用者嘗試同時操縱相同的資料。記錄鎖定和交易通常被實作來解決這些問題。
個別或彙總檢索資料
資料庫的基本職責之一是能夠根據請求檢索資料。請求可能是針對與單個記錄關聯的個別資料片段,或者可能涉及檢索在許多不同記錄中找到的資料。在大多數系統中,這兩種情況都必須是可能的。
在大多數資料庫中,資料庫本身在檢索期間提供一定程度的資料處理。這些可以包括以下類型的操作
- 按條件搜尋
- 篩選和遵守約束
- 提取特定欄位
- 平均、排序等
這些選項可幫助您清楚表達您想要的資料以及最有用的格式。
資料庫的替代方案
在我們繼續之前,我們應該簡要地看一下如果不使用資料庫,您的選擇是什麼。
大多數儲存資料的方法都可以歸類為某種資料庫。一些例外情況包括以下內容。
本機記憶體或臨時檔案系統
有時應用程式會產生無用或僅在應用程式生命週期內相關的資料。在這些情況下,您可能希望將資料保留在記憶體中或將其卸載到臨時檔案系統,因為一旦應用程式退出,您將不再需要它。對於資料永遠無用的情況,您可能希望完全停用輸出或將其記錄到 /dev/null
。
將應用程式資料直接序列化到本機檔案系統
可能不需要資料庫的另一種情況是,可以改為直接序列化和反序列化少量資料。這僅適用於少量資料,且具有可預測的使用模式,不涉及太多(如果有的話)並行性。這無法很好地擴展,但對於某些情況可能很有用,例如輸出本機日誌資訊。
將類似檔案的物件直接儲存到磁碟或物件儲存
有時,應用程式的資料可以直接寫入磁碟或替代儲存,而不是儲存到資料庫中。例如,如果資料已經組織成面向檔案的格式(如影像或音訊檔案),並且不需要額外的元資料,則可能最容易將其直接儲存到磁碟或專用的物件儲存中。
資料庫的用途為何?
幾乎所有非完全靜態的應用程式和網站,在它們的環境中某處都會仰賴資料庫。資料庫的主要目的通常決定了所使用的資料庫類型、儲存的資料以及採用的存取模式。通常會部署多個資料庫系統來處理具有不同需求的不同類型資料。有些資料庫具有足夠的彈性,可以根據不同資料集的需求來履行多種角色。
讓我們來看一個範例,討論一個典型的 Web 應用程式可能與資料庫產生的接觸點。我們假設這個應用程式包含一個基本的店面,並且銷售它在庫存中追蹤的商品。
儲存和處理網站資料
資料庫的主要用途之一是儲存和處理與網站相關的資料。這些項目會影響網站上資訊的組織方式,並且在許多情況下,構成了網站的大部分「內容」。
在上面提到的範例應用程式中,資料庫將會填充網站的大部分內容,包括產品資訊、庫存詳細資訊和使用者個人資料資訊。這表示每次需要顯示產品列表、產品詳細資訊頁面或使用者個人資料時,都會查詢資料庫或某些中介快取。
當顯示目前和過去的訂單、計算運費,以及透過檢查折扣碼或計算常客獎勵來套用折扣時,也會用到資料庫。我們的範例網站將使用資料庫系統,透過結合產品資訊、庫存和使用者資訊來正確建立訂單。記錄在訂單中的綜合資訊將再次儲存在資料庫中,以追蹤訂單處理進度、允許退貨、取消或修改訂單,或提供更好的客戶支援。
分析資訊以協助做出更好的決策
最後一個類別中的動作與網站的基本功能相關。雖然這些對於處理應用程式層的資料需求非常重要,但它們並未呈現全貌。
一旦您的 Web 應用程式開始註冊使用者和處理訂單,您可能希望能夠回答關於不同產品銷售情況、誰是您最有利潤的使用者,以及哪些因素影響您的銷售額等詳細問題。這些是可以隨時執行的分析問題,以收集關於您組織趨勢和績效的最新情報。
這些類型的操作通常稱為商業智慧或分析。它們共同協助組織了解過去發生的事情並做出明智的變更。資料庫系統儲存這些過程中使用的大部分資料,並且必須提供適當的工具或查詢功能來回答有關資料的問題。
在我們的範例應用程式中,可以查詢資料庫以回答有關產品趨勢、使用者註冊人數、我們運送最多的州或誰是我們最忠實的使用者等問題。這些相對基本查詢可用於組成更複雜的問題,以更好地了解和控制影響產品績效的因素。
管理軟體組態
某些類型的資料庫用作網路上其他軟體的組態值儲存庫。它們充當網路上組態值的中央事實來源。當新的服務啟動時,它們會被組態為檢查組態資料庫網路位址中特定索引鍵的值。這使您可以將啟動服務所需的所有資訊儲存在一個位置。
啟動後,可以將應用程式組態為監看與其組態相關的索引鍵是否有變更。如果偵測到變更,應用程式可以重新組態自身以使用新的組態。此流程有時由管理流程協調,該流程透過在新的服務啟動時關閉舊的服務,隨著時間推移逐步推出新的值,隨著時間推移變更作用中的組態以維持可用性。
我們的應用程式可以使用此類型的資料庫來儲存我們整個應用程式環境的持久性組態資料。我們的應用程式伺服器、Web 伺服器、負載平衡器、訊息佇列等等都可以組態為參考組態資料庫以取得其生產設定。然後,應用程式的開發人員可以透過調整中央位置的組態值來修改環境的行為。
收集日誌、事件和其他輸出
執行主動服務請求的應用程式可能會產生大量輸出。這包括日誌檔案、事件和其他輸出。這些可以寫入磁碟或某些其他非託管位置,但這限制了它們的實用性。在資料庫中收集此類型的資料可以更輕鬆地使用、發現模式,以及在發生意外情況或需要了解更多關於歷史效能時分析事件。
我們的範例應用程式可能會在一個資料庫中收集來自我們每個系統的日誌,以便更輕鬆地進行分析。如果我們嘗試分析問題的來源或了解我們環境的整體健康狀況,這可以幫助我們找到事件之間的關聯性。
另外,我們可能會在時間序列資料庫中收集基礎架構和程式碼產生的指標,時間序列資料庫是專門設計用於追蹤一段時間內的值的資料庫。此資料庫可用於支援即時監控和視覺化工具,以便為應用程式的開發和營運團隊提供有關效能、錯誤率等的資訊。
不同的角色如何使用資料庫?
資料庫對於組織內許多不同角色的工作至關重要。在較小的團隊中,一個人或少數幾個人可能負責執行各種角色的職責。在較大的公司中,這些職責通常被劃分為由專職人員或團隊執行的離散角色。
資料架構師
資料架構師負責資料庫系統的整體巨觀結構、它們向應用程式和開發團隊公開的介面,以及滿足組織資料需求所需的基本技術和基礎架構。
擔任此角色的人員通常會決定將用於不同應用程式的適當資料庫模型和實作。他們負責透過調查選項、決定技術、將其與現有系統整合,以及為組織開發全面的資料策略來實施資料庫決策。他們以整體方式處理資料系統,並參與決定和實施各種專案的資料模型。
DBA(資料庫管理員)
資料庫管理員,或 DBA,是負責保持資料系統順利運作的個人。他們負責規劃新的資料系統、安裝和組態軟體、為其他方設定資料庫系統以及管理效能。他們通常還負責保護資料庫的安全、監控其問題,以及調整系統以針對使用模式進行最佳化。
資料庫管理員是個別資料庫系統以及如何將它們與底層作業系統和硬體良好整合以最大化效能的專家。他們與使用資料庫的團隊廣泛合作,以協助管理容量和效能,並協助團隊排除資料庫系統的問題。
應用程式開發人員
應用程式開發人員以許多不同的方式與資料庫互動。他們開發許多與資料庫互動的應用程式。這非常重要,因為這些幾乎總是唯一控制個別使用者或客戶如何與資料庫系統管理的資料互動的應用程式。效能、正確性和可靠性對於應用程式開發人員來說非常重要。
開發人員管理與其應用程式相關聯的資料結構,以將其資料持久儲存到磁碟。他們必須建立或使用可以將其程式設計資料對應到資料庫系統的機制,以便這些組件可以和諧地協同工作。隨著應用程式的變更,他們必須保持資料庫系統內的資料和資料結構同步。我們將在本文稍後討論開發人員如何使用資料庫。
SRE(網站可靠性工程師)和營運專業人員
SRE(網站可靠性工程師)和營運專業人員從基礎架構和應用程式組態的角度與資料庫系統互動。他們可能負責佈建額外容量、建立資料庫系統、確保資料庫組態符合組織準則、監控正常執行時間以及管理備份。
在許多方面,這些人員與 DBA 有重疊的職責,但並非僅專注於資料庫。營運人員確保組織其他部門依賴的應用程式系統(包括資料庫系統)運作可靠且停機時間最少。
商業智慧和資料分析師
商業智慧部門和資料分析師主要對已收集並在資料庫系統中可用的資料感興趣。他們致力於根據資料內的趨勢和模式開發見解,以便他們可以預測未來的績效、為組織提供潛在變更的建議,並回答其他部門(如行銷和銷售部門)關於資料的問題。
資料分析師通常可以完全以唯讀存取權限使用資料系統。他們執行的查詢通常具有與主要應用程式使用的查詢截然不同的效能特性。因此,他們通常使用資料庫複本或副本,以便他們可以執行長時間執行且效能密集型的彙總查詢,否則可能會影響主要資料庫系統的資源使用率。
身為開發人員,我該如何使用資料庫?
那麼,身為應用程式開發人員,您實際上該如何使用資料庫呢?基本上,如果您的應用程式必須管理和持久化狀態,則使用資料庫將是您程式碼的重要組成部分。
在您的應用程式和資料庫之間轉換資料
您將需要建立或使用現有的介面來與資料庫通訊。您可以使用常規網路功能、利用簡單的程式庫或更高層級的程式設計程式庫(例如,查詢建構器或 ORM)直接連線到資料庫。
ORM,或物件關聯對應器,是將關聯式資料庫中找到的表格轉換為物件導向程式語言中使用的類別,反之亦然的對應層。雖然這種轉換通常很有用,但它永遠不是完美的。物件關聯阻抗失配是用於描述關聯式資料庫和物件導向程式如何建構資料之間的差異所引起的摩擦的術語。
雖然關聯式資料庫和物件導向程式設計描述了兩個特定的設計選擇,但在應用程式和資料庫層之間進行轉換的問題是一個普遍性的問題,無論資料庫類型或程式設計範例如何,都存在此問題。資料庫抽象層是更通用的術語,用於指責在這兩個環境之間進行轉換的軟體。
保持結構變更與資料庫同步
當您開發應用程式時,您將發現的一個重要事實是,由於資料庫存在於您的程式碼庫之外,因此需要特別注意以應對資料結構的變更。此問題在某些資料庫設計中比其他資料庫設計更為普遍。
將應用程式的資料結構與資料庫同步的最常見方法是一個稱為資料庫遷移或結構描述遷移的流程(兩者在口語上都簡稱為遷移)。遷移涉及更新資料庫的結構以反映應用程式資料模型演變時的變更。這些通常採用一系列檔案的形式,每個演變一個檔案,其中包含將資料庫轉換為新格式所需的陳述式。
保護對資料的存取並清理輸入
身為開發人員,在使用資料庫時的一項重要責任是確保您的應用程式不允許未經授權存取資料。資料安全性是一個廣泛、多層次的問題,涉及許多利害關係人。最終,某些安全性考量將是您有責任負責的。
您的應用程式將需要對資料庫的特權存取權才能執行例行工作。為了安全起見,資料庫的授權框架可以協助限制您的應用程式可以執行的操作類型。但是,您需要確保您的應用程式適當地限制這些操作。例如,如果您的應用程式管理使用者個人資料,則您必須防止使用者操縱該存取權限以檢視或編輯其他使用者的資訊。
一個具體的挑戰是清理使用者輸入。清理輸入表示在操作使用者提供的任何資料時採取特殊的預防措施。惡意行為者長期以來一直使用正常的使用者輸入機制來欺騙應用程式洩露敏感資料。設計您的應用程式以防止這些情況發生是一項重要的技能。
結論
資料庫是現代應用程式開發中不可或缺的組件。儲存和控制與您的應用程式及其環境相關的有狀態資訊是一項重要的責任,需要可靠性、效能和彈性。
幸運的是,有許多不同的資料庫選項旨在滿足不同類型應用程式的需求。在我們的下一篇文章中,我們將深入探討可用的不同類型資料庫,以及如何使用它們來滿足不同類型的應用程式需求。
Prisma 是一種讓您可以輕鬆地從應用程式使用資料庫的方式。您可以在我們的為什麼選擇 Prisma?頁面中了解更多關於 Prisma 提供的功能。
Prisma 資料庫連接器讓您可以將 Prisma 連接到許多不同類型的資料庫。查看我們的文件以了解更多資訊。
常見問題
資料庫將資料儲存在磁碟或記憶體中。磁碟儲存通常被認為是持久性的,這表示即使資料庫應用程式或電腦本身重新啟動,資料也會可靠地儲存起來以供日後使用。
資料庫管理員,或 DBA,是負責保持資料系統順利運作的個人。他們負責規劃新系統、安裝和組態軟體、為其他方設定資料庫系統以及管理效能。
資料庫抽象層是一個應用程式程式設計介面,它統一了電腦應用程式和資料庫之間的通訊。
資料庫管理是指在整個資料生命週期中採取行動來處理和控制資料,以滿足必要的條件。
一些資料庫管理任務包括效能監控和調整、儲存和容量規劃、備份和復原資料、資料封存、資料分割、複製等等。
資料庫管理系統 (DBMS) 是用於儲存、檢索和對資料執行查詢的軟體系統。它們充當終端使用者和資料庫之間的介面,以執行CRUD 操作。