范式之殤-關系代數與參照完整性在 Web 后臺的落寞

最近參加了一個PostgreSQL相關的茶會,感慨良多。原本話題是PostgreSQL 在 SELECT 場景中憑借其成熟的查詢優化器、豐富的功能特性和靈活的執行策略,展現出顯著優勢。在窗口函數(Window Functions)、JOIN 優化、公共表表達式(WITH/CTE) 等核心功能中,支持嚴格的關系代數和范式約束下的復雜查詢。結果后來,就跑題了,原因是有人提出這些特性其實用的極少。

筆者饒有興趣地聽完了全程,很感慨。本文就圍繞 “范式之殤 - 關系代數與參照完整性在 Web 后臺的落寞” 這一主題,簡要探討當下 WebApp 后端數據庫設計中存在的現象與問題。

如今,我們看到大量 WebApp 的后端數據庫背離了傳統關系型數據庫設計的核心原則,出現簡單表結構、字段冗余、參照完整性缺失等情況,數據庫系統強大的外鍵、檢查等特性被忽視,大量的一致性檢查交給Python后臺而不是DBMS本身。這是一種慵懶,還是因為新的數據和應用環境催生的工程妥協?

一、現象剖析:背離傳統設計原則的 Web 后臺數據庫

在傳統的關系型數據庫理論中,關系代數是數據處理的基石,它定義了選擇、投影、連接等一系列操作,確保數據在不同表之間以規范化的方式關聯與處理。參照完整性則通過外鍵約束等機制,保障數據的一致性和準確性,避免孤立數據與無效關聯。然而在當下的 WebApp 后端數據庫里,這些理論與機制卻逐漸失去了用武之地。

以常見的電商應用為例,按照規范設計,商品表、訂單表、用戶表之間應通過外鍵建立明確關聯,保證訂單引用的商品和用戶信息真實有效。但實際情況卻是,許多開發者為減少表連接操作,在訂單表中冗余商品名稱、用戶姓名等信息,導致數據更新時極易出現不一致問題。同時,由于缺失外鍵約束,訂單表可能存在引用不存在的商品 ID 或用戶 ID 的情況,造成數據混亂。在社交媒體應用中,用戶發布的動態、評論等數據,也常常忽視參照完整性,讓數據維護變得異常困難。

二、范式案例:教科書三范式在實際應用中的困境

在關系型數據庫設計中,范式是衡量數據庫結構合理性的重要標準,其中三范式(3NF)要求數據庫表中非主屬性不存在對碼的傳遞依賴。以一個在線教育系統為例,最初設計有一張 “課程信息表”,包含字段:課程 ID(主鍵)、課程名稱、教師 ID、教師姓名、教師聯系方式。在這個表中,教師姓名和教師聯系方式并不直接依賴于課程 ID,而是通過教師 ID 間接依賴,這就違反了三范式。以下是違反三范式的 “課程信息表” 結構:

字段名類型備注
課程 ID主鍵唯一標識課程
課程名稱課程的名稱
教師 ID標識授課教師
教師姓名教師的姓名
教師聯系方式教師的聯系方式

為了滿足三范式,我們需要將教師相關信息拆分出來,新建 “教師表”,包含教師 ID(主鍵)、教師姓名、教師聯系方式;“課程信息表” 則保留課程 ID(主鍵)、課程名稱、教師 ID,通過教師 ID 與 “教師表” 建立關聯。

滿足三范式后的 “課程信息表” 結構:

字段名類型備注
課程 ID主鍵唯一標識課程
課程名稱課程的名稱
教師 ID標識授課教師,關聯 “教師表” 的教師 ID

滿足三范式后的 “教師表” 結構:

字段名類型備注
教師 ID主鍵唯一標識教師
教師姓名教師的姓名
教師聯系方式教師的聯系方式

這種遵循三范式的設計在傳統單機數據庫中能有效減少數據冗余,保證數據的一致性。但在分布式數據庫和大數據場景下,卻暴露出諸多問題。

在分布式數據庫中,數據分散存儲在多個節點上,上述三范式設計會導致大量的跨節點表連接操作。例如,當查詢某課程及其授課教師信息時,需要在 “課程信息表” 所在節點和 “教師表” 所在節點之間進行數據傳輸與連接,這不僅增加了網絡開銷,還降低了查詢效率,嚴重影響系統性能。而在大數據場景中,數據處理強調的是快速讀取和分析海量數據,三范式嚴格的規范化設計使得數據分散在多個表中,在進行復雜的數據分析任務,如統計不同教師的課程數量及學生反饋情況時,需要進行大量的多表連接操作,這無疑增加了數據處理的復雜性和時間成本,難以滿足大數據實時性和高效性的要求。

三、現象緣由:開發效率與業務需求的權衡

(一)追求快速開發與迭代

在互聯網行業 “唯快不破” 的競爭環境下,快速開發和迭代成為 WebApp 開發的首要目標。傳統的關系型數據庫設計,尤其是遵循嚴格范式和參照完整性原則的設計,需要花費大量時間進行數據庫建模、表結構設計以及關系約束的定義。相比之下,采用簡單的表結構和字段冗余策略,開發者可以更快速地搭建起數據庫基礎架構,滿足業務初期的快速上線需求。例如,一些初創公司在開發初期,為了能在短時間內將產品推向市場,會選擇犧牲數據庫設計的規范性,優先實現功能。

(二)應對復雜多變的業務需求

WebApp 的業務需求往往具有高度的不確定性和快速變化的特點。新功能的不斷添加、業務流程的頻繁調整,使得嚴格遵循范式的數據庫設計難以適應。當需要對業務邏輯進行修改時,調整具有復雜關系約束和范式規范的數據庫結構成本極高,不僅需要修改表結構,還可能涉及到外鍵、觸發器等一系列的調整。而簡單的表結構和冗余字段,在應對業務變化時更加靈活,開發者可以直接在表中添加或修改字段,通過后端代碼來實現業務邏輯的調整,無需過多考慮數據庫結構的完整性和一致性。

(三)開發團隊技術認知與習慣

部分開發團隊對關系型數據庫的高級特性缺乏深入理解和熟練運用,更傾向于使用自己熟悉的后端代碼來處理數據關系和約束。Python 作為一種廣泛應用于 Web 開發的編程語言,具有簡潔易用、生態豐富的特點,很多開發者習慣通過 Python 代碼實現數據的增刪改查以及關系維護。例如,使用 Django、Flask 等框架的 ORM(對象關系映射)功能,雖然方便快捷,但在一定程度上掩蓋了數據庫底層的關系代數和參照完整性機制,導致開發者對數據庫原生特性的依賴降低。
Habit

四、深層次原因:技術生態與行業發展的影響

(一)非關系型數據庫的沖擊

近年來,非關系型數據庫(NoSQL)的興起對傳統關系型數據庫造成了巨大沖擊。NoSQL 數據庫以其靈活的數據模型、高可擴展性和高性能等特點,在處理海量數據、高并發訪問等場景下展現出獨特優勢。像 MongoDB 這樣的文檔型數據庫,采用類似 JSON 的文檔結構存儲數據,無需事先定義嚴格的表結構,非常適合快速變化的業務需求。Redis 作為鍵值對數據庫,在緩存、實時計算等場景中得到廣泛應用。這些非關系型數據庫的出現,讓開發者在數據庫選型時有了更多選擇,也促使他們在 WebApp 開發中嘗試打破傳統關系型數據庫的設計范式,選擇更靈活的方案。
在這里插入圖片描述

(二)分布式架構與微服務的普及

隨著分布式架構和微服務的普及,WebApp 的后端架構變得越來越復雜。在微服務架構中,每個服務都有自己獨立的數據庫,服務之間通過 API 進行通信。這種架構模式下,數據的一致性和完整性維護面臨更大挑戰。為了降低服務之間的耦合度,減少跨服務的數據交互,各個微服務的數據庫往往采用相對獨立和簡單的設計,難以實現全局的關系代數和參照完整性約束。例如,一個電商系統拆分為用戶服務、商品服務、訂單服務等多個微服務,每個服務的數據庫各自獨立設計,用戶表、商品表、訂單表之間的關系難以通過傳統的數據庫約束來維護,更多地依賴于服務間的接口調用和業務邏輯處理。

(三)行業人才培養與技術導向

當前計算機教育和技術培訓體系中,對關系型數據庫高級特性的教學和實踐相對不足。很多開發者在學習過程中,更注重后端框架和編程語言的使用,對數據庫設計和優化缺乏深入學習。同時,行業內對技術的評價和導向也更傾向于功能實現的速度和創新性,忽視了數據庫設計的規范性和性能優化。這種人才培養和技術導向的偏差,導致開發團隊在實際項目中難以充分發揮關系型數據庫的強大功能,進而選擇更簡單但不規范的數據庫設計方案。

五、總結與展望

范式之殤,反映出關系代數與參照完整性在 Web 后臺逐漸落寞的現狀,這是多種因素共同作用的結果。雖然當前這種現象在 WebApp 開發中較為普遍,但我們不能因此否定關系型數據庫及其核心設計理念的價值。在一些對數據一致性、準確性要求較高的場景,如金融、醫療等領域,嚴格遵循范式和參照完整性原則的數據庫設計依然不可或缺。

未來,隨著技術的不斷發展,我們或許可以探索出更有效的解決方案,平衡快速開發與規范設計之間的矛盾。例如,結合人工智能和自動化工具,實現數據庫設計的智能優化和自動維護;進一步完善微服務架構下的數據一致性保障機制等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80380.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80380.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80380.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebRTC工作原理詳細介紹、WebRTC信令交互過程和WebRTC流媒體傳輸協議介紹

簡介 WebRTC(Web Real-Time Communication)是一項允許在網頁瀏覽器之間進行音視頻通信的技術,基本不需要安裝額外的插件。它的核心特點是支持低延遲的點對點(P2P)通訊,常用于視頻聊天、實時文件共享、多人…

【大語言模型ChatGPT4/4o 】“AI大模型+”多技術融合:賦能自然科學暨ChatGPT在地學、GIS、氣象、農業、生態與環境領域中的應用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千問為代表AI大語言模型帶來了新一波人工智能浪潮,可以面向科研選題、思維導圖、數據清洗、統計分析、高級編程、代碼調試、算法學習、論文檢索、寫作、翻譯、潤色、文獻輔助…

提升編程效率的利器:Zed高性能多人協作代碼編輯器

在當今這個快節奏的開發環境中,一個高效、靈活的代碼編輯器無疑對開發者們起著至關重要的支持作用。Zed,作為來自知名編輯器Atom和語法解析器Tree-sitter的創造者的心血之作,正是這樣一款高性能支持多人合作的編輯神器。本文將帶領大家深入探…

基于51單片機步進電機控制—9個等級

基于51單片機步進電機控制 (仿真+程序+設計報告) 功能介紹 具體功能: 1.使用L298驅動步進電機轉動,可分為9個速度等級(1級最快,9級最慢); 2.使用74HC595驅…

【某OTA網站】phantom-token 1004

新版1004 phantom-token 請求頭中包含phantom-token 定位到 window.signature 熟悉的vmp 和xhs一樣 最新環境檢測點 最新檢測 canvas 下的 toDataURL方法較嚴 過程中 會用setAttribute給canvas 設置width height 從而使toDataURL返回不同的值 如果寫死toDataURL的返回值…

LSTM的簡單模型

好的,我來用通俗易懂的語言解釋一下這個 LSTMTagger 類是如何工作的。 1?? 類的目的 這個 LSTMTagger 類是一個用于自然語言處理(NLP)任務的模型,目的是標注輸入的句子,通常用于詞性標注(例如&#xff…

每天批次導入 100 萬對賬數據到 MySQL 時出現死鎖

一、死鎖原因及優化策略 1.1 死鎖原因分析 批量插入事務過大: Spring Batch 默認將整個 chunk(批量數據塊)作為一個事務提交,100 萬數據可能導致事務過長,增加鎖競爭。 并發寫入沖突: 多個線程或批處理作…

DeepResearch深度搜索實現方法調研

DeepResearch深度搜索實現方法調研 Deep Research 有三個核心能力 能力一:自主規劃解決問題的搜索路徑(生成子問題,queries,檢索)能力二:在探索路徑時動態調整搜索方向(劉亦菲最好的一部電影是…

跟我學C++中級篇——STL容器的查找對比

一、C標準庫的查找 在C的STL中,對容器或相關序列的查找中,有兩種方式,一種是std::find,另外一種是std::search。而且在它們的基礎上,還衍生出std::find_if、std::find_if_not、std::find_end等和std::search_n、range…

SpringAI框架中的RAG知識庫檢索與增強生成模型詳解

SpringAI框架中的RAG知識庫檢索與增強生成模型詳解 一、RAG簡介 RAG(Retrieval-Augmented Generation)可以通過檢索知識庫,克服大模型訓練完成后參數凍結的局限性,攜帶知識讓大模型根據知識進行回答。 二、SpringAI框架支持的R…

Delphi12安裝Android開發的配置

Delphi12如果要開發android和Linux系統,需要在安裝的時候安裝這兩個選項,否則,就找不到開發平臺。 1、Adroid開發三劍客必須是指: JDK,SDK,NDK三洋,其中JDK是必須要安裝的,最好使用Installer安裝,否則自解壓的免安裝版在安裝過程中會退出。 2、開始安裝Delphi12. …

OpenHarmony launcher開發——刪除dock欄

開發環境 OpenHarmony 5.0.0 代碼修改 效果

FreeRTOS如何實現100%的硬實時性?

實時系統在嵌入式應用中至關重要,其核心在于確保任務在指定時間內完成。根據截止時間滿足的嚴格程度,實時系統分為硬實時和軟實時。硬實時系統要求任務100%滿足截止時間,否則可能導致災難性后果,例如汽車安全系統或醫療設備。軟實…

微軟推動智能體協同運作:支持 A2A、MCP 協議

今日凌晨,微軟宣布 Azure AI Foundry 和 Microsoft Copilot Studio 兩大開發平臺支持最新 Agent 開發協議 A2A,并與谷歌合作開發擴大該協議,這一舉措對智能體賽道意義重大。 現狀與變革意義 當前智能體領域類似戰國時代,各家技術…

從“山谷論壇”看AI七劍下天山

始于2023年的美國山谷論壇(Hill and Valley Forum)峰會,以“國會山與硅谷”命名,寓意連接科技界與國家安全戰略。以人工智能為代表的高科技,在逆全球化時代已成為大國的致勝高點。 論壇創辦者Jacob Helberg,現在是華府的副國務卿,具體負責經濟、環境和能源事務。早先曾任…

Docker封裝深度學習模型

1.安裝Docker Desktop 從官網下載DockerDesktop,安裝。(默認安裝位置在C盤,可進行修改) "D:\Program Files (x86)\Docker\Docker Desktop Installer.exe" install --installation-dir"D:\Program Files (x86)\Do…

Linux 內核中的 security_sk_free:安全模塊與 Socket 釋放機制解析

引言 在 Linux 內核中,網絡通信和進程間交互(IPC)的核心數據結構之一是 struct sock(即 socket)。其生命周期管理涉及復雜的資源分配與釋放邏輯。本文聚焦于 security_sk_free 這一函數,探討其作用、調用場景以及與安全模塊的交互機制,并解答一個常見疑問:在單機間 TC…

工業與協議融合篇:如何將多個協議集成進一個系統?

?? 本文為《嵌入式通信協議全解析》第六篇,深入探討如何在工業或物聯網系統中同時集成 BLE、CAN、LoRa、MQTT、RS485 等多種通信協議,實現一個高效、可控、穩定運行的嵌入式通信架構。 ?? 一、為什么需要多協議融合? 在真實產品中,單一通信協議往往無法滿足所有業務需…

手撕紅黑樹的 左旋 與 右旋

一、為什么需要旋轉? 在紅黑樹中,插入或刪除節點可能會破壞其五條性質,比如高度不平衡或連續紅節點。 為了恢復紅黑性質,我們采用局部旋轉來“調整樹形結構”,保持平衡。 二、旋轉本質是“局部變形” 左旋和右旋不會…

不用官方EDA怎么開發FPGA?

目前FPGA的開發和官方的EDA工具是高度綁定的,用哪家的芯片只能用其配套的EDA工具進行開發(綜合可選工具,布局布線沒有可選的工具),那么有沒有其他的開發方式呢?今天就介紹一個使用開源工具鏈來開發FPGA的方…