成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構上如何設計領域模型和數據模型?

新聞 前端
捫心自問,你有多久沒有畫數據模型和領域模型了?借鑒DDD(領域驅動設計)的一些設計原則,我覺得有必要花時間認真明晰這兩個概念,幫助大家在工作中,更好的做設計決策。

  [[411161]]

依稀記得我第一次設計一個系統的時候,畫了一堆UML(Unified Modeling Language,統一建模語言)圖,面對Class Diagram(其實就是領域模型),糾結了好久,不知道如何落地。 因為,如果按照這個類圖去落數據庫的話,看起來很奇怪,有點繁瑣。 可是不按照這個類圖落庫的話,又不知道這個類圖畫了有什么用。

捫心自問,你有多久沒有畫數據模型和領域模型了?

現在回想起來,我當時的糾結源自于我對領域模型和數據模型這兩個重要概念的不清楚,先前看過DDD(領域驅動設計),里面一句話我覺得講的很不錯,一個類型可以充當多個角色,這個角色可以是顯式的(實現了某個接口或基類),也可以是隱式的(承擔的具體職責和上下文決定)。

但是每次在新的需求下來,出設計方案的時候在數據模型和領域模型上會耽誤一些時間,根本原因在于對這兩個概念混淆。也因為如此,在設計方案或者在開發過程中會頻繁修改數據模型的設計,因為如果底層的邏輯、概念、理論基礎沒搞清楚的話,其構建在其上的系統也會出現問題,非常嚴重的問題。

借鑒DDD(領域驅動設計)的一些設計原則,我覺得有必要花時間認真明晰這兩個概念,幫助大家在工作中,更好的做設計決策。

一  概念定義

數據模型:面向持久化,數據的載體。關注的是領域知識,是業務領域的核心實體,體現了問題域里面的關鍵概念,以及概念之間的聯系。領域模型建模的關鍵是看模型能否顯性化、清晰的表達業務語義,擴展性是其次。

領域模型:面向業務,行為的載體。關注的是數據存儲,所有的業務都離不開數據,都離不開對數據的CRUD,數據模型建模的決策因素主要是擴展性、性能等非功能屬性,無需過分考慮業務語義的表征能力。

一個強調的是實體,另一個強調的是關系,再細想下我們當初建模的時候都是用啥的啥圖-ER圖,這下子就被慢慢帶偏了。設計的數據模型里面帶了實體聲明也帶了業務關系,兩者開始混淆。

是的,二者的確有一些共同點,有時候領域模型和數據模型會長的很像,甚至會趨同,這很正常。但更多的時候,二者是有區別的。正確的做法應該是有意識地把這兩個模型區別開來,分別設計,因為他們建模的目標會有所不同。

如下圖所示,數據模型負責的是數據存儲面向DB,其要義是擴展性、靈活性、性能。而領域模型負責業務邏輯的實現,其要義是業務語義顯性化的表達,以及充分利用OO的特性增加代碼的業務表征能力。

途中標識灰色的部分其實還可以細分,業務到模型之間也可進行拆分,涉及到一些命名,這里就不做展開。

在日常開發過程中,我們在很多的系統業務設計上,并沒很好的處理數據模型和領域模型的關系,反而在設計的時候一個是把數據模型當領域模型,另一個是把領域模型當數據模型。

二  錯把領域模型當數據模型

最近在優化低代碼那塊的元數據優化,里面涉及到一些元數據存儲、拓展問題。這塊邏輯大致可以簡單概括:

數據表單設計時候,用戶可以動態配置列的屬性以及對列屬性根據對應的數據類型動態匹配相應函數。

對于這個規則,領域模型很簡單,就是提供了列基本配置信息和屬性配置信息配置數據,如下圖所示:

如果按照這個思路下去就會存在兩張表meta_field_definition、meta_field_attribute 兩張數據表,一張用來存儲列的基礎定義,另一張用來定義列的屬性配置以及拓展。

如果我們這個干了,我們就犯了把領域模型當數據模型的錯誤,這里設計一張數據表足夠。在原來的元數據列定義表里面加屬性配置字段fd_attribute 以Json的形式存儲,再基礎表單的基礎上加拓展表fd_extend_feature(當前業務用不上作為基礎保留的拓展字段)

調整后有什么好處:

  • 首先,一張表單的維護成本肯定比多張表的維護成本低

  • 其次,其數據的擴展性更好。比如:針對某種數據類型要支持某種定制的業務配置和函數支持,如果是一張表,我們就需要往屬性表里面繼續添加新的業務支持配置。但是如果我們修改為一張表在原有的元數據中保持不變在屬性拓展里面以JSON格式添加配置即可。

可是,在業務代碼里面,如果是基于JSON在做事情可不那么美好。我們需要把JSON的數據對象,轉換成有業務語義的領域對象,這樣,我們既可以享受數據模型擴展性帶來的便捷性,又不失領域模型對業務語義顯性化帶來的代碼可讀性。

三  錯把數據模型當領域模型

的確,數據模型最好盡量可擴展,畢竟,改動數據庫可是個大工程,不管是加字段、減字段,還是加表、刪表,都涉及到不少的工作量。

拿上面的案例來講

可以注意到fd_extend_feature 拓展表所創建的,便于對表的垂直拓展補充。JSON字段也好,垂直表也好,雖然可以很好的解決數據存儲擴展的問題,但是,我們最好不要把這些擴展(features)當成領域對象來處理,否則,你的代碼根本就不是在面向對象編程,而是在面向擴展字段(features)編程,從而犯了把數據模型當領域模型的錯誤。更好的做法,應該是把數據對象(Data Object)轉換成領域對象來處理。但是在處理改字段的時候,如果頻繁操作addFdExtendFeature、getFdExtendFeature是一種典型的把數據模型當領域模型的錯誤示范。

四 總結

在日常設計和開發中我們應該是把領域模型、數據模型區別開來,讓他們各司其職,從而更合理的架構我們的應用系統。其中,領域模型是面向領域對象的,要盡量具體,盡量語義明確,顯性化的表達業務語義是其首要任務,擴展性是其次。而數據模型是面向數據存儲的,要盡量可擴展。

回歸到主題一個類型可以充當多個角色,這個角色可以是顯式的(實現了某個接口或基類),也可以是隱式的(承擔的具體職責和上下文決定),

  • 數據模型:面向持久化,數據的載體。

  • 領域模型:面向業務,行為的載體。

 

 

責任編輯:張燕妮 來源: 極客小智
相關推薦

2021-01-15 13:18:39

數據模型領域模型代碼

2021-02-28 22:20:25

2022-06-14 08:02:35

關系模型數據模型文檔模型

2010-05-26 14:37:56

Cassandra數據

2021-01-27 05:34:33

Python對象模型

2009-09-18 14:07:51

LINQ to SQL

2012-03-05 10:54:03

NoSQL

2023-10-26 06:55:46

大數據數據倉庫

2016-11-02 12:32:47

數據分析大數據模型

2010-08-11 09:29:25

FlexJava數據模型

2017-06-27 10:08:29

數據倉庫模型

2011-03-23 09:54:47

數據模型數據庫設計

2024-09-12 10:56:53

高級數據模型向量數據庫Milvus

2022-08-15 14:49:12

物聯網數據模型存儲

2022-12-09 09:39:01

數據治理

2024-05-13 11:25:08

概念模型邏輯模型物理模型

2023-02-20 14:44:22

DDD領域模型

2023-08-31 17:10:56

數據倉庫高級互聯網架構架構

2024-04-23 07:52:25

2020-10-14 06:28:38

數據倉庫模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人jvid在线播放 | 亚洲精品乱码久久久久久蜜桃 | 亚洲一区二区视频 | 精品三区| 91人人视频在线观看 | 精品一区二区三区电影 | 国产精品xxxx | 久久专区 | 在线视频日韩精品 | 久久久久久久综合色一本 | 成人在线中文 | 99精品国产一区二区青青牛奶 | 一级在线观看 | 自拍偷拍亚洲一区 | 中文字幕在线观看一区二区 | 最新中文字幕久久 | 可以免费观看的av | 成人av播放 | 国产精品国产精品国产专区不片 | 日韩精品一区二区三区中文字幕 | 午夜三级网站 | 一区二区三区在线 | 欧 | 日韩欧美专区 | 午夜精品久久久久99蜜 | av中文字幕在线播放 | 欧美色综合一区二区三区 | 亚洲九色 | 日韩免费一区二区 | 91免费看片 | 精品在线一区 | 你懂的国产 | 日本一道本视频 | 亚洲一区二区视频 | 国产aⅴ爽av久久久久久久 | 欧美一级特黄aaa大片在线观看 | 色影视| 日韩免费毛片视频 | 国产欧美在线 | 久久草视频 | 国产日产精品一区二区三区四区 | 国产成人aⅴ |