国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

PostgreSQL把3個(gè)組件藏了20年,開發(fā)者裝完才發(fā)現(xiàn)坑

0
分享至


全球87%的初創(chuàng)公司數(shù)據(jù)庫在6個(gè)月內(nèi)陷入性能危機(jī),根因不是代碼爛,是設(shè)計(jì)階段埋的雷。PostgreSQL(一種開源關(guān)系型數(shù)據(jù)庫引擎)的安裝向?qū)в?個(gè)默認(rèn)勾選項(xiàng),90%的人直接點(diǎn)下一步——這相當(dāng)于買房時(shí)沒看戶型圖。

數(shù)據(jù)庫設(shè)計(jì)不是"先跑起來再優(yōu)化",而是"第一步錯(cuò),后面全錯(cuò)"的工程。

數(shù)據(jù)庫系統(tǒng)的5個(gè)隱藏組件

多數(shù)人以為數(shù)據(jù)庫就是"存數(shù)據(jù)的箱子"。實(shí)際上,一個(gè)完整的數(shù)據(jù)庫系統(tǒng)(Database System)包含5層:硬件層、數(shù)據(jù)層、軟件層、用戶層,以及最容易被忽視的元數(shù)據(jù)層(Metadata Layer)。

元數(shù)據(jù)是什么?你可以理解為"數(shù)據(jù)的數(shù)據(jù)"——它記錄每張表的創(chuàng)建時(shí)間、字段類型、索引位置。沒有它,數(shù)據(jù)庫就像圖書館沒有分類目錄,書越多越亂。

pgAdmin 4(PostgreSQL的可視化管理工具)的界面設(shè)計(jì)有個(gè)細(xì)節(jié):左側(cè)導(dǎo)航樹默認(rèn)折疊了"Catalogs"(編目)節(jié)點(diǎn)。這個(gè)節(jié)點(diǎn)里存的就是元數(shù)據(jù)。很多開發(fā)者用了三年都沒展開過。

DBMS vs 數(shù)據(jù)庫系統(tǒng):一個(gè)被混淆了30年的概念

面試常問:"MySQL和數(shù)據(jù)庫系統(tǒng)有什么區(qū)別?"標(biāo)準(zhǔn)答案是:MySQL是DBMS(數(shù)據(jù)庫管理系統(tǒng)),只是數(shù)據(jù)庫系統(tǒng)的軟件層組件。

這個(gè)區(qū)分在實(shí)際工作中意義重大。當(dāng)你說"數(shù)據(jù)庫掛了",可能是硬盤壞了(硬件層)、連接池滿了(軟件層)、或者權(quán)限表損壞(元數(shù)據(jù)層)。定位錯(cuò)層級(jí),排查方向全歪。

PostgreSQL的安裝包為什么默認(rèn)勾選"Command Line Tools"(命令行工具)?因?yàn)閳D形界面(GUI)只暴露20%的功能。真正處理鎖沖突、死鎖檢測(cè),必須進(jìn)psql命令行。

有個(gè)冷知識(shí):pgAdmin 4本身也是用PostgreSQL存儲(chǔ)配置信息的,它用自己的數(shù)據(jù)庫管理自己。

好數(shù)據(jù)庫的4個(gè)反直覺標(biāo)準(zhǔn)

教科書說數(shù)據(jù)庫要"安全、一致、高效、可擴(kuò)展"。但實(shí)操中,好數(shù)據(jù)庫的判斷標(biāo)準(zhǔn)更具體:


第一,數(shù)據(jù)冗余度可控。完全消除冗余是理論理想,實(shí)際業(yè)務(wù)需要適度冗余來換查詢速度。電商系統(tǒng)的訂單表通常冗余存儲(chǔ)商品名稱,就是為了避免JOIN(表連接)操作拖慢列表頁。

第二,異常行為可追蹤。PostgreSQL的日志配置默認(rèn)關(guān)閉"慢查詢?nèi)罩?,這意味著性能問題發(fā)生時(shí),你找不到兇手。好設(shè)計(jì)必須在搭建階段就開啟log_min_duration_statement,閾值設(shè)100毫秒。

第三,變更可回滾。這不是指?jìng)浞?,是指結(jié)構(gòu)變更。pgAdmin 4的"查詢工具"執(zhí)行ALTER TABLE(修改表結(jié)構(gòu))前不會(huì)自動(dòng)備份,但有個(gè)隱藏功能:事務(wù)塊。把變更語句包在BEGIN和ROLLBACK之間,可以先看效果再提交。

第四,權(quán)限粒度細(xì)到字段級(jí)。多數(shù)系統(tǒng)只做到表級(jí)權(quán)限,但醫(yī)療數(shù)據(jù)庫需要讓護(hù)士看到病人姓名卻看不到身份證號(hào)。PostgreSQL的Column-Level Security(列級(jí)安全)功能,官方文檔藏在第5章第7節(jié),搜索排名前三的教程都沒提。

數(shù)據(jù)庫設(shè)計(jì)的5個(gè)階段:為什么80%的人卡在第二步

完整的設(shè)計(jì)流程是:需求分析→概念設(shè)計(jì)→邏輯設(shè)計(jì)→物理設(shè)計(jì)→實(shí)施維護(hù)。聽起來像瀑布模型,實(shí)際是個(gè)循環(huán)。

需求分析階段要產(chǎn)出ER圖(實(shí)體關(guān)系圖)。工具推薦用draw.io或dbdiagram.io,但有個(gè)陷阱:這些工具生成的SQL腳本默認(rèn)用INTEGER(整數(shù)型)做主鍵,而高并發(fā)場(chǎng)景應(yīng)該用BIGINT(長整型)。INT上限21億,抖音的日活視頻數(shù)早就超了。

概念設(shè)計(jì)到邏輯設(shè)計(jì)的轉(zhuǎn)換,核心是規(guī)范化(Normalisation)。第一范式(1NF)要求原子性,第二范式(2NF)消除部分依賴,第三范式(3NF)消除傳遞依賴。背定義沒用,看個(gè)實(shí)例:

圖書館系統(tǒng)的借閱記錄表,如果設(shè)計(jì)成:借閱ID、讀者姓名、讀者電話、圖書名稱、借閱日期——這違反了幾條范式?答案是2NF和3NF都違反。讀者信息應(yīng)該拆到讀者表,圖書信息拆到圖書表,借閱記錄只存ID關(guān)聯(lián)。

但規(guī)范化有個(gè)代價(jià):查詢時(shí)需要JOIN。圖書館系統(tǒng)的管理員后臺(tái)要顯示"某讀者借了什么書",原本單表查詢變成三表JOIN。這時(shí)候要反規(guī)范化,在借閱記錄表冗余存儲(chǔ)圖書名稱——前提是確認(rèn)圖書名稱不會(huì)頻繁變更。

設(shè)計(jì)是妥協(xié)的藝術(shù),不是范式的考試。

實(shí)戰(zhàn):一個(gè)圖書館系統(tǒng)的3個(gè)設(shè)計(jì)陷阱

我們用PostgreSQL實(shí)現(xiàn)一個(gè)簡(jiǎn)化版圖書館系統(tǒng),暴露3個(gè)真實(shí)坑點(diǎn)。


Step 1:需求與ER圖。實(shí)體有讀者(Reader)、圖書(Book)、借閱記錄(Borrow)。關(guān)系是:讀者和圖書多對(duì)多,通過借閱記錄關(guān)聯(lián)。ER圖畫完別急著建表,先問自己:圖書的"狀態(tài)"字段用ENUM(枚舉型)還是VARCHAR(字符串)?

ENUM在PostgreSQL里是真正的類型,只能取預(yù)設(shè)值(可借、已借、預(yù)約、下架),存儲(chǔ)空間小,查詢快。但加新狀態(tài)需要ALTER TYPE,會(huì)鎖表。VARCHAR靈活,但無法阻止臟數(shù)據(jù)(有人手滑輸成"已借出")。

Step 2:規(guī)范化實(shí)戰(zhàn)。初始設(shè)計(jì)把作者信息存在圖書表:作者名、作者簡(jiǎn)介、作者國籍。這違反3NF,因?yàn)樽髡呙髡吆?jiǎn)介是傳遞依賴。拆出作者表后,發(fā)現(xiàn)新問題:一本書可能有多個(gè)作者,關(guān)系是多對(duì)多,需要中間表。

PostgreSQL處理多對(duì)多有個(gè)優(yōu)化:GIN索引(通用倒排索引)。在圖書-作者關(guān)聯(lián)表的作者ID字段建GIN索引,"查某作者的所有書"能從全表掃描變成毫秒級(jí)。

Step 3:SQL實(shí)現(xiàn)。建表語句有個(gè)細(xì)節(jié):CREATE TABLE時(shí)加IF NOT EXISTS,防止重復(fù)執(zhí)行報(bào)錯(cuò)。但生產(chǎn)環(huán)境別用,它會(huì)靜默跳過真正的錯(cuò)誤。

外鍵約束(FOREIGN KEY)默認(rèn)級(jí)聯(lián)行為是RESTRICT(限制),刪除父表記錄時(shí)會(huì)報(bào)錯(cuò)。圖書館系統(tǒng)需要SET NULL(置空):刪除作者記錄時(shí),關(guān)聯(lián)圖書的作者字段變成NULL,而不是阻止刪除或級(jí)聯(lián)刪書。

這個(gè)配置在pgAdmin 4的圖形界面里藏得很深:建外鍵時(shí),"Action"標(biāo)簽頁下有4個(gè)下拉框,分別對(duì)應(yīng)UPDATE和DELETE時(shí)的行為。默認(rèn)全是NO ACTION,和RESTRICT效果一樣,但語義不同——NO ACTION允許延遲檢查,RESTRICT立即檢查。

99%的開發(fā)者沒點(diǎn)過這個(gè)標(biāo)簽頁。

安裝向?qū)Ю锏哪莻€(gè)密碼,為什么讓你寫紙上

回到開頭。PostgreSQL安裝時(shí)創(chuàng)建的"postgres"超級(jí)用戶,密碼如果丟失,Windows用戶需要改注冊(cè)表,Mac/Linux需要改pg_hba.conf文件再重啟服務(wù)——整個(gè)過程30分鐘起,且期間數(shù)據(jù)庫不可用。

更隱蔽的坑是端口5432。如果本機(jī)裝了Docker,或者有其他PostgreSQL實(shí)例,安裝向?qū)Р粫?huì)自動(dòng)檢測(cè)沖突。它會(huì)繼續(xù)裝,然后啟動(dòng)失敗,報(bào)錯(cuò)信息是"Address already in use"(地址已被占用)。新手會(huì)以為是防火墻問題,排查兩小時(shí)。

驗(yàn)證安裝是否成功,別只打開pgAdmin 4看能不能連上。在命令行執(zhí)行:

psql -U postgres -c "SELECT version();"

這條命令繞過了圖形界面,直接測(cè)試核心服務(wù)。如果連不上,pgAdmin 4的報(bào)錯(cuò)信息是"Unable to connect to server",而psql會(huì)告訴你具體是密碼錯(cuò)、端口錯(cuò)、還是服務(wù)沒啟動(dòng)。

工具越漂亮,信息越模糊。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
沙特:若對(duì)伊開戰(zhàn)將啟動(dòng)巴基斯坦核保護(hù)傘

沙特:若對(duì)伊開戰(zhàn)將啟動(dòng)巴基斯坦核保護(hù)傘

Nee看
2026-03-25 19:07:00
特朗普殺了他全家!他會(huì)當(dāng)伊朗張學(xué)良嗎?

特朗普殺了他全家!他會(huì)當(dāng)伊朗張學(xué)良嗎?

烏鴉校尉
2026-03-25 18:19:47
馬筱梅眼含淚水回應(yīng)!買房真因不是自私,汪小菲第一次和張?zhí)m同隊(duì)

馬筱梅眼含淚水回應(yīng)!買房真因不是自私,汪小菲第一次和張?zhí)m同隊(duì)

潮鹿逐夢(mèng)
2026-03-24 13:13:55
研究所所長猥褻下屬后續(xù),女主多張高清照曝光,知情人再爆料

研究所所長猥褻下屬后續(xù),女主多張高清照曝光,知情人再爆料

觀察鑒娛
2026-03-26 09:25:28
不得不說,面相真的能看出一個(gè)人的路子。停播快兩個(gè)月的李亞鵬,

不得不說,面相真的能看出一個(gè)人的路子。停播快兩個(gè)月的李亞鵬,

小光侃娛樂
2026-03-26 17:05:03
為什么只有革命衛(wèi)隊(duì)與美以干,而伊朗40萬國防軍沉默觀戰(zhàn)?

為什么只有革命衛(wèi)隊(duì)與美以干,而伊朗40萬國防軍沉默觀戰(zhàn)?

廖保平
2026-03-17 09:04:38
連蔡依林都在玩,“雪山救狐貍”到底是什么梗?對(duì)話視頻原創(chuàng)作者:最初只是為了賣醬板鴨,特意設(shè)置反轉(zhuǎn)劇情,沒想到會(huì)這么火

連蔡依林都在玩,“雪山救狐貍”到底是什么梗?對(duì)話視頻原創(chuàng)作者:最初只是為了賣醬板鴨,特意設(shè)置反轉(zhuǎn)劇情,沒想到會(huì)這么火

極目新聞
2026-03-25 19:37:57
露出了狐貍尾巴?朱立倫主動(dòng)邀約國民黨“立委”,或?yàn)楸茖m鄭麗文

露出了狐貍尾巴?朱立倫主動(dòng)邀約國民黨“立委”,或?yàn)楸茖m鄭麗文

承受之重
2026-03-25 12:45:53
1981年,彭真獄中見江青,江青出言不遜提出:我要見華國鋒鄧小平

1981年,彭真獄中見江青,江青出言不遜提出:我要見華國鋒鄧小平

微野談寫作
2026-01-27 06:00:03
人情薄如紙!丈夫住院100天沒人探望,出院當(dāng)天大伯突然打來電話

人情薄如紙!丈夫住院100天沒人探望,出院當(dāng)天大伯突然打來電話

水泥土的搞笑
2026-03-26 17:37:27
15戰(zhàn)14勝,加時(shí)掀翻東部第一!新鷹王27+8+12證明賤賣特雷楊有理

15戰(zhàn)14勝,加時(shí)掀翻東部第一!新鷹王27+8+12證明賤賣特雷楊有理

鍋?zhàn)踊@球
2026-03-26 11:25:55
充電樁市場(chǎng)價(jià)格戰(zhàn)慘烈!每度電服務(wù)費(fèi)收三毛 利潤只有4分錢

充電樁市場(chǎng)價(jià)格戰(zhàn)慘烈!每度電服務(wù)費(fèi)收三毛 利潤只有4分錢

快科技
2026-03-24 00:22:40
江蘇擬建一條過江通道,或?qū)⒃倨啤笆澜缂o(jì)錄”

江蘇擬建一條過江通道,或?qū)⒃倨啤笆澜缂o(jì)錄”

水泥土的搞笑
2026-03-26 14:04:59
到底是誰讓馬景濤穿這身衣服的?簡(jiǎn)直是災(zāi)難現(xiàn)場(chǎng)!

到底是誰讓馬景濤穿這身衣服的?簡(jiǎn)直是災(zāi)難現(xiàn)場(chǎng)!

西樓知趣雜談
2026-03-25 23:41:24
美軍發(fā)布戰(zhàn)果,摧毀中國產(chǎn)戰(zhàn)機(jī),伊朗空軍損失殆盡

美軍發(fā)布戰(zhàn)果,摧毀中國產(chǎn)戰(zhàn)機(jī),伊朗空軍損失殆盡

愛吃醋的貓咪
2026-03-22 22:29:08
利空突襲,全線殺跌!

利空突襲,全線殺跌!

中國基金報(bào)
2026-03-26 13:16:51
周杰倫的INS被網(wǎng)友沖爆,新歌MV里手表調(diào)到“83”,疑用舊戀情炒作賣新唱片

周杰倫的INS被網(wǎng)友沖爆,新歌MV里手表調(diào)到“83”,疑用舊戀情炒作賣新唱片

回旋鏢
2026-03-25 20:38:44
延壽9年,心臟病風(fēng)險(xiǎn)降60%!悉尼大學(xué)最新:飲食、睡眠、運(yùn)動(dòng)最佳組合出爐,小改變也大有益

延壽9年,心臟病風(fēng)險(xiǎn)降60%!悉尼大學(xué)最新:飲食、睡眠、運(yùn)動(dòng)最佳組合出爐,小改變也大有益

醫(yī)諾維
2026-03-24 17:02:18
廣東:力爭(zhēng)到2026年底 建成50個(gè)以上特色鮮明、功能突出的生產(chǎn)性服務(wù)業(yè)集聚區(qū)

廣東:力爭(zhēng)到2026年底 建成50個(gè)以上特色鮮明、功能突出的生產(chǎn)性服務(wù)業(yè)集聚區(qū)

財(cái)聯(lián)社
2026-03-26 10:15:09
中國軍事專家送日本3句話,太絕了,真不是嚇唬他們

中國軍事專家送日本3句話,太絕了,真不是嚇唬他們

安安說
2026-03-26 11:21:19
2026-03-26 20:03:00
像素與芯片
像素與芯片
有態(tài)度網(wǎng)友ytd
466文章數(shù) 2關(guān)注度
往期回顧 全部

科技要聞

Meta高管狂分百億期權(quán),700名員工卻下崗

頭條要聞

張雪峰留巨額遺產(chǎn):二婚妻子或拿50% 剩下的女兒占1/3

頭條要聞

張雪峰留巨額遺產(chǎn):二婚妻子或拿50% 剩下的女兒占1/3

體育要聞

申京努力了,然而杜蘭特啊

娛樂要聞

劉曉慶妹妹發(fā)聲!稱姐姐受身邊人挑撥

財(cái)經(jīng)要聞

油價(jià)"馴服"特朗普?一到100美元就TACO

汽車要聞

一汽奧迪A6L e-tron開啟預(yù)售 CLTC最大續(xù)航815km

態(tài)度原創(chuàng)

家居
健康
本地
手機(jī)
公開課

家居要聞

傍海而居 靜觀蝴蝶海

轉(zhuǎn)頭就暈的耳石癥,能開車上班嗎?

本地新聞

救命,這只醬板鴨已經(jīng)在我手機(jī)復(fù)仇了一萬遍

手機(jī)要聞

狂攬307萬!紅米殺瘋了:K90破150萬、Turbo 5破百萬,性價(jià)比贏麻

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進(jìn)入關(guān)懷版