數(shù)據(jù)基礎(chǔ)(一)雙向關(guān)聯(lián)

0 評論 2275 瀏覽 5 收藏 15 分鐘

在B端系統(tǒng)中,數(shù)據(jù)不是孤島,而是網(wǎng)絡(luò)。本文從“雙向關(guān)聯(lián)”這一基礎(chǔ)概念切入,系統(tǒng)梳理其在業(yè)務(wù)建模、權(quán)限設(shè)計、流程驅(qū)動等場景中的應(yīng)用邏輯。這是一次對數(shù)據(jù)底層結(jié)構(gòu)的回歸,也是構(gòu)建高質(zhì)量系統(tǒng)認知的起點。

B端系統(tǒng)的本質(zhì)作用是,用戶操作可視化的系統(tǒng)功能,對底層數(shù)據(jù)進行更改,并呈現(xiàn)操作結(jié)果,即顯示數(shù)據(jù)。

數(shù)據(jù)表與數(shù)據(jù)表之間通常會有某種關(guān)系,除單向關(guān)聯(lián)外,雙向關(guān)聯(lián)也很常見,同時存在一些問題。

一、數(shù)據(jù)表的雙向關(guān)聯(lián)

數(shù)據(jù)表A的字段關(guān)聯(lián)數(shù)據(jù)表B的字段,同時數(shù)據(jù)表B的字段也關(guān)聯(lián)數(shù)據(jù)表A的字段。

注意:被關(guān)聯(lián)字段需具備唯一性和非空性,常見為“主鍵”(Primary Key)。

例如:

①數(shù)據(jù)表_用戶

②數(shù)據(jù)表_部門

說明:

“數(shù)據(jù)表_用戶”通過字段“department_id”外部鏈接“數(shù)據(jù)表_部門”。

“數(shù)據(jù)表_部門”通過字段“user_id”外部鏈接“數(shù)據(jù)表_用戶”。

二、數(shù)據(jù)查詢利弊分析

2.1 優(yōu)點

1、查詢效率提升

雙向關(guān)聯(lián)允許從任一端直接查詢另一端的數(shù)據(jù),無需通過中間表或多層嵌套查詢。

2、業(yè)務(wù)邏輯更直觀

在某些業(yè)務(wù)場景中,雙向關(guān)聯(lián)更符合現(xiàn)實邏輯。例如,“用戶” 表和 “部門” 表,用戶表存部門ID,部門表存用戶ID,雙向關(guān)聯(lián)能清晰體現(xiàn)兩者的關(guān)系。

3、簡化特定業(yè)務(wù)邏輯

對于需要雙向操作的場景,雙向關(guān)聯(lián)可直接通過字段判斷關(guān)系,無需額外邏輯計算,降低代碼復(fù)雜度。如:社交軟件中的“好友關(guān)系”,A是B的好友,B也是A的好友。

4、數(shù)據(jù)完整性約束

在數(shù)據(jù)庫層強制保證了數(shù)據(jù)的邏輯一致性,避免了“幽靈數(shù)據(jù)”。例如:用戶表中某用戶記錄被刪除后,訂單表中關(guān)聯(lián)該用戶的訂單未被同步刪除,這些訂單就成了“幽靈訂單”。

2.2 弊端

1、數(shù)據(jù)冗余與一致性

雙向關(guān)聯(lián)本質(zhì)上是同一關(guān)系的重復(fù)存儲(如A→B和B→A指向同一關(guān)系),可能導(dǎo)致冗余。若更新其中一端時未同步更新另一端,會出現(xiàn)數(shù)據(jù)不一致(例如,A的關(guān)聯(lián)字段已修改,B的關(guān)聯(lián)字段仍為舊值),破壞數(shù)據(jù)完整性。

示例:如果要將用戶“張三”從“客服A”轉(zhuǎn)移到“客服B”

①更新users表:將“張三”的customer_id改為“客服B”的ID。

②檢查“客服A”的user_id是否還是“張三”,如果是,需要將其置為NULL或指派給其他人。

③檢查“客服B”是否需要將 user_id更新為“張三”。

風(fēng)險:

任何一步失敗,都會導(dǎo)致數(shù)據(jù)矛盾。例如,“張三”在user表里屬于“客服B”,但“客服A”的主要聯(lián)系人是“張三”。

2、循環(huán)依賴問題

在復(fù)雜業(yè)務(wù)中,雙向關(guān)聯(lián)可能導(dǎo)致表之間的循環(huán)依賴(如A關(guān)聯(lián)B,B關(guān)聯(lián)C,C關(guān)聯(lián)A),增加數(shù)據(jù)庫設(shè)計的耦合度,不利于后期擴展和重構(gòu)?!跋扔须u還是先有蛋”。

例如:創(chuàng)建“客服A”時,想指定“張三”為主要聯(lián)系人,但此時“張三”可能還沒有被創(chuàng)建,或者他的customer_id還沒有設(shè)置。

3、維護成本高

無論是新增、刪除還是更新數(shù)據(jù),都需要同時操作兩端的關(guān)聯(lián)字段,否則會產(chǎn)生“幽靈數(shù)據(jù)” 或無效關(guān)聯(lián)。

三、常見解決方案

3.1 中間關(guān)系表

1、撤銷“表A”和“表B”中直接指向?qū)Ψ降淖侄巍?/p>

2、新建一個“關(guān)系表AB”,它至少包含兩個外鍵字段:A_id和B_id,分別指向“表A”和“表B”的主鍵(唯一且非空字段)。

3、中間表本身也可以有自己的主鍵(如一個自增id)和額外的屬性字段。

數(shù)據(jù)關(guān)系表

3.1.1 優(yōu)點

1、支持多對多關(guān)系,避免數(shù)據(jù)冗余

舉例:

①若直接在 “學(xué)生表” 中添加course_ids字段存儲所選課程 ID,會出現(xiàn) “一個學(xué)生對應(yīng)多個課程 ID,字段值重復(fù)且難以維護”;反之在 “課程表” 中添加student_ids也同理。

②中間表(如student_course)僅存儲student_id和course_id,每條記錄代表 “一個學(xué)生選了一門課程”,無冗余且關(guān)系清晰。

2、降低表結(jié)構(gòu)耦合度,增強擴展性

中間表將關(guān)聯(lián)關(guān)系與主表數(shù)據(jù)分離,主表無需存儲與自身業(yè)務(wù)無關(guān)的關(guān)聯(lián)字段,符合 “單一職責(zé)原則”。

3、解決了數(shù)據(jù)一致性與循環(huán)依賴

①一致性:關(guān)聯(lián)信息只在一個地方(中間表)存儲和維護,從根本上杜絕了雙向直接關(guān)聯(lián)中兩個字段可能不同步的風(fēng)險。

②循環(huán)依賴:創(chuàng)建順序變得簡單。可以先創(chuàng)建用戶,再創(chuàng)建客戶,最后在中間表里建立兩者的聯(lián)系。

4、查詢靈活,支持復(fù)雜關(guān)聯(lián)統(tǒng)計

中間表便于通過JOIN操作實現(xiàn)雙向查詢,且支持按關(guān)聯(lián)關(guān)系篩選、統(tǒng)計數(shù)據(jù)。

5、歷史記錄與審計追蹤

每一條關(guān)系都是一條獨立的記錄,你可以輕松地:

①記錄關(guān)系的創(chuàng)建和刪除時間,追蹤變化。

②實現(xiàn)“軟刪除”,只將關(guān)系標(biāo)記為失效,而不真正刪除記錄,以備審計。

3.1.2 弊端

1、增加查詢復(fù)雜度

①關(guān)聯(lián)查詢時必須通過中間表進行JOIN,相比兩表直接關(guān)聯(lián)(如一對多的單向外鍵),SQL語句會更長,涉及的表更多。

②查詢性能下降。多一次JOIN操作,理論上會比直接查詢一個字段更耗時。

2、數(shù)據(jù)冗余與維護成本

中間表會增加數(shù)據(jù)庫的表數(shù)量和存儲開銷(尤其在關(guān)聯(lián)關(guān)系頻繁的場景下,中間表可能產(chǎn)生大量記錄)。

3、業(yè)務(wù)邏輯的間接性

不直觀。關(guān)聯(lián)關(guān)系被轉(zhuǎn)移到了另一個表中,業(yè)務(wù)代碼不能直接從表A或表B的字段中直觀地看到關(guān)系,必須通過查詢中間表來獲取。

不適用于一對一或一對多的關(guān)系。

四、數(shù)據(jù)表與原型設(shè)計

4.1 原型設(shè)計需關(guān)注的核心問題

1、反問自己:這個交互操作,背后是在改變哪個數(shù)據(jù)表的哪個字段?

①明確數(shù)據(jù)關(guān)系與功能的匹配性

厘清頁面涉及的表關(guān)系(一對多 / 多對多),確保功能設(shè)計符合底層數(shù)據(jù)結(jié)構(gòu)的特性。

②避免操作流程導(dǎo)致幽靈數(shù)據(jù)

設(shè)計增刪改查流程時,需考慮關(guān)聯(lián)數(shù)據(jù)的聯(lián)動處理(如刪除主數(shù)據(jù)時,子數(shù)據(jù)是否保留 / 刪除 / 置空)。

2、反問自己:這個頁面展示的信息,需要連接哪幾張表?

③平衡“用戶直觀性”與“數(shù)據(jù)規(guī)范性”

用戶視角可能希望 “直接編輯關(guān)聯(lián)數(shù)據(jù)”,但技術(shù)上需通過中間表或外鍵約束實現(xiàn),需在原型中設(shè)計合理的交互邏輯(如彈窗選擇、批量關(guān)聯(lián)),而非強行 “直觀化” 導(dǎo)致數(shù)據(jù)混亂。

④提前規(guī)劃關(guān)聯(lián)數(shù)據(jù)的查詢與展示

多表關(guān)聯(lián)的查詢結(jié)果(如 “用戶 + 訂單 + 商品”)需明確展示維度。

3、避免在原型中模糊了“關(guān)系”與“實體”的界限,當(dāng)關(guān)系帶有重要屬性時,它在概念上已經(jīng)升格為一個需要被獨立管理的實體。

4.2 示例說明

4.2.1? 一對多關(guān)系的功能設(shè)計(以“用戶-訂單”為例)

1、錯誤設(shè)計

在“用戶詳情頁”中設(shè)計“直接編輯訂單信息”的功能(如在用戶表單中嵌入訂單列表的編輯框)。

  • 問題:用戶表與訂單表是一對多關(guān)系(訂單表通過user_id關(guān)聯(lián)用戶),訂單屬于獨立子表數(shù)據(jù)。若在用戶頁直接編輯訂單,會混淆“用戶主數(shù)據(jù)”與“訂單子數(shù)據(jù)”的邊界,且技術(shù)上需跨表更新,易引發(fā)數(shù)據(jù)不一致。

2、合理設(shè)計

  • 在“用戶詳情頁”通過“查看訂單”按鈕跳轉(zhuǎn)至獨立的“訂單列表頁”(篩選條件為當(dāng)前用戶 ID);
  • 訂單的新增/編輯在獨立頁面完成,僅通過“用戶選擇器”關(guān)聯(lián)用戶(本質(zhì)是設(shè)置user_id)。

優(yōu)勢:符合一對多的“子表依賴主表”邏輯,操作流程與外鍵關(guān)聯(lián)規(guī)則一致,避免數(shù)據(jù)混亂。

3、進一步分析說明

4.2.2 一對多關(guān)系的刪除聯(lián)動設(shè)計(以“商品-評論”為例)

1、錯誤設(shè)計

設(shè)計“刪除商品”按鈕時,僅刪除商品表記錄,未處理關(guān)聯(lián)的評論表數(shù)據(jù)(評論表仍保留product_id指向已刪除商品)。

  • 問題:評論成為幽靈數(shù)據(jù),后續(xù) “按商品查評論” 時會出現(xiàn) “無對應(yīng)商品的評論”,統(tǒng)計或展示時產(chǎn)生混亂

2、合理設(shè)計

  • 方案1(徹底刪除):刪除商品時,彈窗提示“此操作將同時刪除該商品的所有評論,是否確認?”,確認后通過事務(wù)同步刪除商品和關(guān)聯(lián)評論;
  • 方案2(邏輯刪除):商品表添加is_deleted字段,刪除時標(biāo)記為“已刪除”,評論表查詢時過濾掉關(guān)聯(lián)“已刪除商品”的記錄(前端不展示,但數(shù)據(jù)保留)。

優(yōu)勢:通過流程設(shè)計避免幽靈數(shù)據(jù),符合“主表刪除需處理子表關(guān)聯(lián)”的原則。

4.2.3 多對多關(guān)系的功能設(shè)計(以“學(xué)生-課程”為例)

1、錯誤設(shè)計

在“學(xué)生詳情頁”設(shè)計“課程ID輸入框”,允許用戶手動輸入多個課程ID(如“1,2,3”),并在“課程詳情頁”同步設(shè)計“學(xué)生ID輸入框”。

  • 問題:對應(yīng)數(shù)據(jù)庫中“學(xué)生表存course_ids、課程表存student_ids”的錯誤設(shè)計,違反原子性原則,且頁面中手動輸入多ID易出錯,后續(xù)查詢/統(tǒng)計需解析字符串,體驗極差。

2、合理設(shè)計

  • 引入“選課管理”中間頁面(對應(yīng)中間表student_course),作為學(xué)生與課程的關(guān)聯(lián)入口;
  • 在“學(xué)生詳情頁”點擊“選擇課程”,彈出“課程選擇彈窗”(多選框形式),選中后提交即向中間表插入多條(student_id, course_id)記錄;
  • 在“課程詳情頁”點擊“查看學(xué)生”,通過中間表關(guān)聯(lián)查詢并展示選課學(xué)生列表。

優(yōu)勢:交互邏輯與中間表設(shè)計匹配,用戶無需感知底層關(guān)聯(lián),通過“選擇”而非“輸入ID” 完成操作,既符合多對多關(guān)系,又提升體驗。

3、進一步分析說明

4.2.4 有屬性的多對多關(guān)系的功能設(shè)計(以“學(xué)生-課程”為例)

1、錯誤設(shè)計

在“學(xué)生詳情頁”直接羅列課程名稱,未設(shè)計“開課日期、成績”等關(guān)聯(lián)屬性的展示區(qū)域。

問題:學(xué)生與課程的多對多關(guān)系中,中間表通常存儲關(guān)聯(lián)屬性,若頁面只展示課程名稱,會丟失核心業(yè)務(wù)數(shù)據(jù)(用戶無法查看“課程開課時間或課程總成績”)。

2、合理設(shè)計

在學(xué)生詳情頁以“表格”形式展示關(guān)聯(lián)課程,列信息包括“課程名稱、開課時間、課程總成績”,其中“開課時間、課程總成績”來自中間表。

優(yōu)勢:完整呈現(xiàn)多對多關(guān)系中的關(guān)聯(lián)屬性,符合業(yè)務(wù)邏輯(學(xué)生與課程的關(guān)聯(lián)不僅是“包含”,還需記錄交易細節(jié))。

3、進一步分析說明

本文由 @產(chǎn)品-子魚 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)作者許可,禁止轉(zhuǎn)載

題圖來自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發(fā)揮!