領域建模之數據模型設計方法論

来源:https://www.cnblogs.com/Jcloud/archive/2023/07/28/17588076.html
-Advertisement-
Play Games

本文通過實際業務需求場景建模案例,為讀者提供一種業務模型向數據模型設計的方法論,用於指導實際開發中如何進行業務模型向數據模型轉化抽象,並對設計的數據模型可用性、擴展性提供了建議性思考 ...


本文通過實際業務需求場景建模案例,為讀者提供一種業務模型向數據模型設計的方法論,用於指導實際開發中如何進行業務模型向數據模型轉化抽象,並對設計的數據模型可用性、擴展性提供了建議性思考。通過文章,讀者可以收穫到業務模型向數據模型抽象可參考的一種方法論,並針對後期業務需求變化,儘可能降低模型調整或者模型推a倒重建的風險。本文可以重點關註建模實施流程,針對自己實際業務場景,不斷抽象優化自己的數據模型。

一、背景

從研發人員的角度出發,技術更多的是為業務賦能,同時研發人員也可以通過業務模型設計來提升自己的技術,他們更多的是技術控,追求擁有更多的技術棧。不過今天不討論具體的技術,準備換一種思維模式來分享下自己在業務開發中的一些經驗,並結合實際案例來闡述針對業務場景進行數據建模的方法論。

開發人員在日常工作中,參與PRD評審、聽產品經理講述用戶故事、提出各種需求。評審結束,一般會一股腦投入到設計開發,而資料庫表設計就是其中不可或缺的一個過程。對於熟悉的業務模塊,通過對需求分析,可以輕而易舉的完成數據表設計,但對於非熟悉業務領域,可能會經過多輪PRD分析,整理一套數據表結構基礎,然後對其追加欄位,就完成了基礎的數據模型設計。而在這個過程中,往往會感覺沒有可以參考的理論,有時候甚至對設計的資料庫表產生懷疑,不斷考慮此設計是否符合業務、表結構設計後期是否具有通用性、表之間關係是否恰當可擴展等等。今天來談些在實際業務開發中,針對數據建模的一些思考。

一個好的方法論一定是告訴你當你面對一個全新的業務場景或未知領域的時候,如何去獨立分析和解決問題。

二、名詞

領域:可以理解為傳統軟體需求分析中的業務場景對應的業務域,比如常見的電商、物流、運輸等領域。

子域:領域的部分業務域,比如電商的部分訂單、支付、庫存等子域。

建模:業務域的映射和抽象。

三、思考

面向對象分析的設計思維模式:

圖1. 用戶角度到開發角度思考

四、方法論

4.1  實施步驟

  1. 識別對象;
  2. 組織對象;
  3. 定義對象模型間關係;
  4. 完善模型細節(屬性、狀態);
  5. 領域模型到數據模型映射;

4.2 CASE實踐(社區團購--預排線調度建模案例)

(1)PRD需求描述

預排線系統從OFC系統獲取團單數據:截單之前每天下午OFC推送一份當天需要預排線的數據出來,這些數據包括每個已經成團的團單(生產單)和截止到當前時間團單的商品數據,這裡麵包含當天已經取消的團單(即所有的商品數量都是0)。同時在截單之後,OFC會把截單後的團單數據再推送一次,裡面包含當天已經取消的團單(所有的商品數量都是0);

團單數據創建、更新、刪除:如果下發的生產單號在預排線系統不存在,則創建團單信息;如果下發的生產單號在預排線系統存在,則更新下麵單商品的數量、團單的收件地址、經緯度、團長ID、姓名、電話等信息;如果有新增的商品則添加團單下的商品數據;如果更新的團單數量,其下麵所有商品的個數都為0,代表這個團單已經被取消,則邏輯刪除這個團單,同時取消這個團單和對應線路的綁定關係;更新的商品數量都是更新的商品的當前數量,不會更新調度時的數量和實際的數量。

(2)識別對象

Note:

  1. 復用或者修改已有模型(比如:運輸需求、計劃、詢價單、對賬單、財務賬單等);
  2. 行業、公司內概念列表(比如:社區團購、分揀、調度、詢價、計費等);
  3. 名詞。

識別出的對象:

OFC 團單 單 預排線數據 生產單 商品 商品數量 預排線系統 團單收件地址 經緯度 團長ID 姓名 電話 線路 商品當前數量 調度時的數量 實際數量

(3)組織對象

Note:

  1. 一詞多用、重覆、歧義:歸結為一個對象模型;
  2. 複數:students --> student 歸結為一個對象模型;
  3. 屬性:可以歸結為對象模型的特征,不單獨升級為一個對象,但特殊場景下,比如文章的分類可以為文章的一個屬性,但是當分類又有子屬性時,比如有子屬性標簽,這時可以把分類單獨升級為對象模型。類似設計資料庫表,是設計為欄位還是新設計一張表一樣。

分析對象:

  1. OFC :系統
  2. 團單:生產單 單 團單收件地址 經緯度 團長ID 姓名 電話
  3. 預排線:預排線系統,預排線模型 線路
  4. 商品:商品 商品數量 商品當前數量 調度時的數量 實際數量

(4)定義對象模型關係

Note:

  1. 外鍵
  2. 關係:一對一、一對多、多對多,關係傳遞

分析關係:

  1. "同時取消這個團單和對應線路的綁定關係" -----> 預排線包括多個團單,預排線 VS 團單= one vs many
  2. "如果有新增的商品則添加團單下的商品數據" -----> 團單下有多個商品,團單 VS 商品 = one vs many

圖2. 模型間關係

(5)完善模型信息(屬性狀態)

Note:

  1. 子域:模型對象的子對象信息,比如:店鋪模型下的員工模型、地址庫模型、員工薪資模型等。
  2. 屬性:模型對象的特征表現
  3. 狀態:狀態機
  4. 邊界:對象模型間交互部分,分清楚哪些屬於A對象哪些是B對象

完善對象模型:

圖3.對象模型(模擬欄位信息)

(6)領域對象到數據模型

Note:

  1. 派生:數據模型之間的一種關聯、繼承、映射出的一種關係。比如“預排線模型”中“運輸任務編碼”屬性,屬於調度域的模型屬性,後期會與調度域系統產生關聯關係,所以把運輸任務編碼作為“預排線模型”的一個派生屬性。
  2. 冗餘:①低級冗餘(顯示)--模型依賴外部模型屬性欄位顯示使用,這時不用再關聯查詢或者通過IO獲取;②高級冗餘(計算)--比如外部模型有單價、數量屬性且穩定不變,則模型可以依賴其計算結果,省去二次計算邏輯;
  3. 擴展表:①數據模型的垂直拆分,減少大對象;②變更不是很頻繁的欄位可以放到擴展模型;

社區團購排線部分模型設計圖:

圖4 終版數據模型圖

五、擴展

5.1 領域模型設計階段思考

對象:領域模型對象,上述案例分析到的對象模型;

功能:哪些業務功能劃分到領域(微服務)或者子域(模塊)裡面

介面:服務應該暴露的介面能力;

5.2  方法論

動詞+賓語 <----> 方法介面+對象

  • 業務功能操作和實體對象分離,更容易進行微服務劃分;
  • 某個微服務應該暴露哪些介面;
  • 領域上下文邊界,介面應屬於哪個領域提供。

圖5 領域模型調用關係圖

五、結語

一個好的方法論一定是告訴你當你面對一個全新的業務場景或未知領域的時候,如何去獨立分析和解決問題。

作者:京東物流 鄭朋輝

來源:京東雲開發者社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230726164318392-162588362.png) # 1. 結果集 ## 1.1. sql ```sql select empno,mgr from emp ord ...
  • ### [2023 年 7 月 28 日 22:16:06] ## ref 取 render 方式組件節點 一開始註意到組件 setup 和 render 一起使用的情況,好奇怎麼通過 ref 取到 render 中 jsx 里的節點,一開始試了以下的嘗試,結果是 undefined 的: ```j ...
  • # Mapbox—geocoder搜索地點error eaching the server [——There was an errorr eaching the server](#focus) 環境說明: vue3.3.4 mapbox-gl: 2.13.0 @mapbox/mapbox-gl-ge ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在Js中有一些比較冷門但是非常好用的方法,我在這裡稱之為高級方法,這些方法沒有被廣泛使用或多或少是因為存在一些相容性的問題,不是所有的瀏覽器都讀得懂的。這篇文章主要就是對這些方法做一個總結,有些方法在我們開發過程中有著重要的作用,我 ...
  • # VuePress@next 使用數學公式插件 搞了一個VuePress1.0的 現在升級了一下,但是使用數學公式的插件老報錯啊!經過不懈努力,終於搞定了。現在記錄一下。 ## VuePress 介紹 [VuePress](https://vuepress.github.io/zh) 是一個以 M ...
  • ### JSON [`parse()`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse): 以文本字元串形式接受 JSON 對象作為參數,並返回相應的對象。 [` ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230725164759224-48972087.png) # 1. 控制請求數量 ## 1.1. 這個世界可以隨時摧毀我們的系統 ### 1.1.1. 要麼拒絕工作 ### ...
  • 系統設計藍圖指南 我們有時敏捷軟體開發過程,系統設計採用一張紙,如下圖供參考圖例DNS接上面, APP或用戶 請求與響應,分頁,過期頭,Gzip,冪等性設計負載均衡,API網關,訪問日誌,CDN,服務伸縮,通用扇出服務《系統設計藍圖指南》源文件PDF 在:鏈接:https://pan.baidu.c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...