立體數(shù)據(jù)模型

2024-03-07 18:37 更新

立體數(shù)據(jù)模型

立體數(shù)據(jù)模型是Dorado中全新的、最為核心的概念。

  • 什么叫立體數(shù)據(jù)模型?
  • 為什么需要引入立體數(shù)據(jù)模型?
  • 怎么實(shí)現(xiàn)立體數(shù)據(jù)模型?

什么叫立體數(shù)據(jù)模型?

Dorado主張數(shù)據(jù)和表現(xiàn)的分離,將界面上的數(shù)據(jù)抽象為專門的數(shù)據(jù)模型,成為一個(gè)獨(dú)立的子系統(tǒng)。下面我們從數(shù)據(jù)流轉(zhuǎn)的角度分析一下WEB應(yīng)用中的數(shù)據(jù)處理過程??聪聢D: Web應(yīng)用的運(yùn)行過程就是對(duì)數(shù)據(jù)進(jìn)行處理的過程,上圖我們分析的就是從數(shù)據(jù)庫出發(fā)到瀏覽器轉(zhuǎn)一圈,最后通過ORM業(yè)務(wù)邏輯處理重新保存到數(shù)據(jù)庫的這么一個(gè)過程。 我們先分析從數(shù)據(jù)庫到瀏覽器:首先從數(shù)據(jù)開始,以目前最常用的開發(fā)模式分析,例如我們使用Hibernate,那么這些數(shù)據(jù)就會(huì)被ORM處理機(jī)制轉(zhuǎn)換為通過一堆JavaBean描述的對(duì)象,我們稱它們?yōu)轭I(lǐng)域?qū)ο竽P?DomainObject),之后領(lǐng)域?qū)ο罂赡軙?huì)經(jīng)過業(yè)務(wù)邏輯的組裝,重新拼裝或改寫,變成一種全新的格式,也有可能形式上沒有什么變化,但是作用上已經(jīng)發(fā)生了很大的變化,這些對(duì)象我們叫視圖數(shù)據(jù)對(duì)象。這些對(duì)象是為前臺(tái)提供服務(wù)的。之后這些ViewObject通過HTTP傳輸,被response到瀏覽器中,成為瀏覽器前端所有表達(dá)的數(shù)據(jù)。 再來看從瀏覽器到數(shù)據(jù)庫:ViewObject輸出到瀏覽器之后,這些數(shù)據(jù)被展示給客戶,由用戶做各種操作,可能改寫其中的部分信息,最后它們會(huì)被提交到服務(wù)端,并被轉(zhuǎn)換為ViewObject。之后服務(wù)端要抽取這些ViewObject中的信息組裝為ORM中所需要的領(lǐng)域?qū)ο?,再持久化到?shù)據(jù)庫中。 平面數(shù)據(jù)和立體數(shù)據(jù) 要進(jìn)一步分析前面的數(shù)據(jù)處理,我們以平面數(shù)據(jù)和立體數(shù)據(jù)來概括數(shù)據(jù)在前述過程中的兩種數(shù)據(jù)載體形式。 概念:

  • 平面數(shù)據(jù):通過鍵值來表達(dá)數(shù)據(jù)與數(shù)據(jù)間的關(guān)系。例如關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)。每一條數(shù)據(jù)都是獨(dú)立的,它們之間的關(guān)系是通過外鍵值指向另外一個(gè)數(shù)據(jù)的主鍵值。
  • 立體數(shù)據(jù):通過引用來表達(dá)數(shù)據(jù)與數(shù)據(jù)間的關(guān)系。例如通過Hibernate獲得的領(lǐng)域模型數(shù)據(jù)。如我們拿到一個(gè)部門對(duì)象,部門對(duì)象內(nèi)部還包含所有的雇員對(duì)象。

以數(shù)據(jù)載體形式的角度再度觀察 根據(jù)這平面數(shù)據(jù)和立體數(shù)據(jù)的概念,我們將前面WEB應(yīng)用中的數(shù)據(jù)處理過程的圖,進(jìn)行著色區(qū)分這兩種數(shù)據(jù),其中的立體數(shù)據(jù)被標(biāo)以藍(lán)色

整個(gè)過程充斥著平面到立體,立體到平面,平面到立體的惡性循環(huán),整個(gè)過程非常不流暢。這也是傳統(tǒng)WEB開發(fā)中相對(duì)比較麻煩和復(fù)雜的一個(gè)重要原因。在關(guān)系數(shù)據(jù)庫到DomainObject端的相互轉(zhuǎn)換我們尚可以依靠Hibernate這些相對(duì)成熟的ORM工具幫助我們以較小的代價(jià)完成轉(zhuǎn)換工作,但是在Java端到瀏覽器端立體到平面,平面到立體的轉(zhuǎn)換過程中卻需要我們完全靠自己的手工完成。 對(duì)數(shù)據(jù)形式進(jìn)行一些歸納 通過上面的分析,我們對(duì)數(shù)據(jù)形式進(jìn)行一些歸納: 數(shù)據(jù)的本質(zhì)是立體的,現(xiàn)實(shí)生活的檢驗(yàn)我們知道對(duì)象之間都是引用的關(guān)系;

  • 但是保存在數(shù)據(jù)庫中的數(shù)據(jù)是平面的,關(guān)系型數(shù)據(jù)庫的好處是有利于存儲(chǔ)和檢索;
  • ORM把數(shù)據(jù)庫中的平面數(shù)據(jù)映射成立體的;
  • XML、JSON數(shù)據(jù)可以方便的描述較簡單立體數(shù)據(jù),它可以描述數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系,但又局限性:它可以描述樹狀的數(shù)據(jù),但是無法描述網(wǎng)狀的數(shù)據(jù),所幸日常開發(fā)中一般不會(huì)遇到網(wǎng)狀的頁面展現(xiàn)和表達(dá)形式;
  • 網(wǎng)頁Form中的數(shù)據(jù)是平面的;
  • 在進(jìn)行運(yùn)算時(shí),處理立體數(shù)據(jù)比處理平面數(shù)據(jù)容易,這是無容置疑的;
  • Dorado5的Dataset是平面的(如果你用過Dorado5的話,就很容易想明白);

為什么需要引入立體數(shù)據(jù)模型?

為什么需要引入立體數(shù)據(jù)模型?根據(jù)前面的分析,其實(shí)我們不難看出如下兩點(diǎn):

  • 由于數(shù)據(jù)的本質(zhì)是立體的,因此當(dāng)界面越能展現(xiàn)和處理這種立體關(guān)系時(shí),它對(duì)用戶友好程度就越高。
  • Hibernate(ORM)的使用經(jīng)驗(yàn)告訴我們,平面數(shù)據(jù)和立體數(shù)據(jù)進(jìn)行互轉(zhuǎn)時(shí)需要付出很大的代價(jià)。

綜合以上兩點(diǎn),我們需要在Client端提供立體數(shù)據(jù)模型以提高界面的友好度、同時(shí)改善應(yīng)用數(shù)據(jù)處理過程的流暢性。即將下圖紅框中的部分變?yōu)榱Ⅲw數(shù)據(jù)模型: 我們將上圖再簡化一下,就總結(jié)為如下圖: 從左邊平面DataSet到右面立體DataSet就是我們的目標(biāo)。

怎么實(shí)現(xiàn)立體數(shù)據(jù)模型?

首先進(jìn)一步了解兩個(gè)概念: 數(shù)據(jù)載體

  • 用于封裝和承載數(shù)據(jù)的對(duì)象,通常由數(shù)據(jù)實(shí)體和數(shù)據(jù)實(shí)體集合這兩種對(duì)象構(gòu)成。
  • 數(shù)據(jù)實(shí)體是指一個(gè)擁有一到n個(gè)屬性的對(duì)象。在Java中通常表現(xiàn)為POJO Bean或Map;在Javascript中通常表現(xiàn)為JSON對(duì)象。
  • 數(shù)據(jù)實(shí)體集合用于管理0到N個(gè)相似的數(shù)據(jù)實(shí)體。在Java中通常表現(xiàn)為List/Set;在Javascript中通常表現(xiàn)為Array。

數(shù)據(jù)集

  • 數(shù)據(jù)集是指那些根據(jù)業(yè)務(wù)邏輯或編程的需要提取出來的一堆數(shù)據(jù)。
  • 一個(gè)數(shù)據(jù)集的所有數(shù)據(jù)往往在邏輯上具有很強(qiáng)的相關(guān)性。比如當(dāng)我們開發(fā)一個(gè)部門信息的維護(hù)界面時(shí),會(huì)提取出某部門及其中所有雇員的信息作為一個(gè)數(shù)據(jù)集。

Dorado中的數(shù)據(jù)載體 Dorado在Server端不提供專用的數(shù)據(jù)載體對(duì)象,而是直接使用POJO Bean/Map以及List/Set來作為數(shù)據(jù)載體。

  • 事實(shí)上,處于狀態(tài)管理等需要Dorado會(huì)動(dòng)態(tài)代理(Cglib或Javassist)對(duì)原始的數(shù)據(jù)載體進(jìn)行一個(gè)功能增強(qiáng),只是大多數(shù)情況下開發(fā)員不需要也不會(huì)注意到這一點(diǎn)。
  • 這一做法可以在很大程度上簡化Dorado與用戶的業(yè)務(wù)邏輯層對(duì)接的難度。Dorado在Client端提供了專用的數(shù)據(jù)載體Entity/EntityList,他們的用法非常類似于JSON/Array。同時(shí),Dorado也支持直接以普通的JSON/Array最為數(shù)據(jù)載體。
  • 之所以要在Client端提供了專用的數(shù)據(jù)載體,是因?yàn)镈orado需要為數(shù)據(jù)載體添加很多諸如異步數(shù)據(jù)裝載、狀態(tài)管理、翻頁、管理當(dāng)前記錄、數(shù)據(jù)校驗(yàn)等功能。

Dorado的數(shù)據(jù)集——DataSet Dorado中提供了DataSet作為數(shù)據(jù)集的描述,DataSet主要的生命周期在Client端。相對(duì)Dorado5而言,Dorado中DataSet的功能被極大的弱化了。其最重要的用途就是為其管理那堆數(shù)據(jù)賦予一個(gè)ID,以便于數(shù)據(jù)感知控件能夠找到這些數(shù)據(jù)。另外DataSet不再局限于二維表結(jié)構(gòu)數(shù)據(jù),而是可以支持非常自由的數(shù)據(jù)形式:

  • 數(shù)據(jù)實(shí)體的集合
  • 單個(gè)的數(shù)據(jù)實(shí)體
  • 數(shù)據(jù)實(shí)體構(gòu)成的樹狀結(jié)構(gòu)
  • 甚至是一個(gè)簡單的字符串-

一個(gè)稍復(fù)雜的數(shù)據(jù)集場(chǎng)景

想象如下這樣一個(gè)人事組織架構(gòu)的場(chǎng)景。 這是一個(gè)部門組織樹,頂級(jí)節(jié)點(diǎn)下包含三個(gè)子部門,其中第一個(gè)部門下有三個(gè)員工,第三個(gè)部門下又包含了兩個(gè)子部門,另外這個(gè)部門的內(nèi)部還有三個(gè)員工。如果我們采用平面數(shù)據(jù)模型(包括Dorado5),無論通過1個(gè)還是多個(gè)Dataset都無法實(shí)現(xiàn)這樣的數(shù)據(jù)模型。而Dorado用一個(gè)DataSet就實(shí)現(xiàn)了。 我們將上圖轉(zhuǎn)換為下圖: 其中Department擁有一個(gè)自關(guān)聯(lián)關(guān)系,另外還有一個(gè)Employee的聚合關(guān)系。 如果采用立體數(shù)據(jù)模型開發(fā)的時(shí)候,如果你能很容易的將上圖快速的轉(zhuǎn)換為一顆樹形結(jié)構(gòu),將會(huì)對(duì)你的開發(fā)帶來很多好處:更快速的設(shè)計(jì)和開發(fā)。

立體數(shù)據(jù)模型帶來的新問題

問題1: 如何對(duì)模型中的數(shù)據(jù)實(shí)體進(jìn)行進(jìn)一步的描述? 例如上面的部門對(duì)象,其中既有子部門又有員工集合,我們無法簡單的按照平面數(shù)據(jù)模型的那種定義方式,定義其中各個(gè)屬性的校驗(yàn)規(guī)則、數(shù)據(jù)類型、顯示格式等等。解決的辦法是我們?cè)贒orado中引入全新的概念——DataType,這個(gè)對(duì)象我們將在后面的章節(jié)詳細(xì)介紹。 問題2:如何實(shí)現(xiàn)與數(shù)據(jù)感知控件的綁定? 在平面數(shù)據(jù)模型中,數(shù)據(jù)綁定比較簡單,比如Dorado5中我們將一個(gè)Grid與一個(gè)DataSet一綁定,就可以直接展示其中的數(shù)據(jù)了,應(yīng)為其中的DataSet就是一個(gè)二維表。但是Dorado中就不能這么做了,例如我們之前的數(shù)據(jù)模型: 如果頁面上有一個(gè)Grid,用來顯示員工信息,但是上圖中我們?nèi)绾巫孏rid顯示第一個(gè)Department下的員工,或者我們要顯示第三個(gè)Department下對(duì)應(yīng)的員工。為了解決這個(gè)問題,我們需要再引入一個(gè)全新的概念——DataPath,后續(xù)章節(jié)將詳細(xì)介紹。 問題3:如何對(duì)管理當(dāng)前記錄? 在Dorao5中每一個(gè)Grid都有當(dāng)前記錄的概念,但是在Dorado中由于采用立體數(shù)據(jù)結(jié)構(gòu),如上面的組織結(jié)構(gòu)圖中的第三個(gè)部門中,相對(duì)部門來說當(dāng)前部門是指紅色框中的部門,而當(dāng)前員工是指下面紅框中的員工。從這兒我們能看出在Dorado中當(dāng)前記錄的概念已經(jīng)比Dorado5中更為豐富,一個(gè)DataSet擁有多個(gè)當(dāng)前記錄,其中的每一個(gè)集合都需要管理各自的當(dāng)前記錄。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)