轉帖|其它|編輯:郝浩|2010-11-04 16:52:37.000|閱讀 1061 次
概述:面向對象的基本哲學是認為世界是由各種各樣具有自己的運動規律和內部狀態的對象所組成的;不同對象之間的相互作用和通訊構成了完整的現實世界。因此,人們應當按照現實世界這個本來面貌來理解世界,直接通過對象及其相互關系來反映世界。這樣建立起來的系統才能符合現實世界的本來面目。 本文主要介紹在企業應用快速開發平臺的實現中,如何實現可視化動態數據建模,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
1 背景
面向對象的基本哲學是認為世界是由各種各樣具有自己的運動規律和內部狀態的對象所組成的;不同對象之間的相互作用和通訊構成了完整的現實世界。因此,人們應當按照現實世界這個本來面貌來理解世界,直接通過對象及其相互關系來反映世界。這樣建立起來的系統才能符合現實世界的本來面目。
遺憾的是世界是面向對象的,而關系數據庫是面向關系的,人們一直在實踐如何從現實世界中客觀存在的事物(即對象)出發來構造軟件系統,并在系統構造中盡可能運用人類的自然思維方式,強調直接以問題域(現實世界)中的事物為中心來思考問題,認識問題,并根據這些事物的本質特點,把它們抽象地表示為系統中的對象,作為系統的基本構成單位。這可以使系統直接地映射問題域,保持問題域中事物及其相互關系的本來面貌。
企業級管理系統的開發都不可避免的卷入到其中,許多的ORM的框架試圖解決這個問題,但大都僅僅解決數據的變換和存取。然而軟件系統所涉及的內容還包括數據建模、權限系統、用戶管理、組織結構、工作流程、狀態模型、協作模型等一大批緊密相關的內容,如果相關的框架沒有進行整合形成一個全套的平臺,學習和使用這些框架對于開發人員仍然是一個噩夢,我們的最終目標是將開發人員從無休無止的框架和技術中解放出來,真正關心如何快速滿足客戶的需求,創造高端的價值。
2 唯一標識和識別
在面向對象的系統中,任何數據都是對象,為了統一標識每個對象,在本平臺中為每個對象分配一個唯一標識符,稱為對象ID,對象ID必須在對象的整個生命周期中保持不變。為了確保每個對象的標識符不重復,即使不同的類型,ID也不重復,ID用GUID(全局唯一標識符)。
在數據庫中,所有的數據都存儲在二維表中,通過ER分析轉換為數據庫結構也可以部分表達面向對象模型中抽象、組合、關聯等概念,但不能很好處理繼承關系,對象模型的數據不能簡單的存儲在關系數據庫中。
為了方便OR映射和開發實現,數據庫中所有的表都使用ID作為主鍵,避免使用復合主鍵,復合主鍵會導致數據庫設計和編碼復雜化。通過ID就可以唯一標識一個對象,通過一個ID也容易建立對象之間的關系,編程傳參數時也方便。
對象唯一標識ID一般只作為系統運行的內部標識,人不容易識別,系統使用者一般不需要看到ID。一般為不同的業務對象還會添加諸如編碼類型的屬性,以便方便人眼識別該對象。
一種簡單的做法就是提供流水號編碼,可支持定義編碼的前綴、后綴、碼的位數、填充字符等信息,每當創建對象時,對于“序列”類型的字段系統根據規則自動生成流水碼,生成過程一般不需要人的干預,一般也不允許修改系統自動生成的流水碼。
還有更加復雜的編碼,比如機械行業經常為零部件編碼,一般采用分段編碼的方式,系統應該可自定義編碼規則,例如定義編碼的各個段,包括常量段、流水段、分隔符段、交互段等。在生成一個編碼的時候,有些段自動生成,有些段需人機交互生成。
對于ID識別碼、流水號碼和自定義編碼數據庫都采用字符串方式存儲,但是在開發平臺中分別作為獨立的數據類型提供,使得我們的平臺的類型比數據庫更加豐富。
3 類型系統
數據庫中的數據類型是與業務完全無關的,一般都是原子類型,而我們的系統希望提供更加高層次的類型,以方便開發各類管理信息系統應用,比如我們的系統提供Sequence類型(表達流水碼)、Code類型(自定義編碼),當然也提供不過User、Organization、Directory、File等更加高層的類型。不同的數據庫的數據類型也略有差異,而我們的平臺應該做到數據庫系統無關,通過ORM的框架屏蔽不同的數據系統之間的差異,業務邏輯的開發人員和二次開發人員不需要關心底層的類型系統,只需要基于平臺提供的高層次的類型系統,可以更快的開發應用,由ORM實現與數據庫類型的自動映射。
在系統中支持的復雜數據類型,在架構設計中我們通常稱為實體類(Entity Class),在我們的數據模型中稱對象類型(Item Type),而數據庫一般是沒有對象的概念的,都是關系表。我們的辦法是,在我們的平臺中創建一個Item Type,一般數據庫中創建一張表,將Item Type的屬性映射到表的字段。數據庫的簡單類型可以理解為表的某個列,一個簡單類型的值可以理解為該表中一行某個列的實例。數據庫中的復雜數據類型可以理解為表,復雜數據類型的一個實例可以理解為數據庫的表的一行。復合對象在數據庫中通過外鍵關系和關聯表來實現。
4 創建對象類型
為了方便理解對象類型與子類型,下面舉例說明一下物料(Material)的概念,生產企業習慣將最終產品之外的,在生產領域流轉的一切材料(不論其來自生產資料還是生活資料),燃料,零部件(Part),半成品,外協件以及生產過程中必然產生的邊,角,余料,廢料以及各種廢物統稱為"物料"。物料是制造業企業很重要的一個類型。
在系統中創建“物料”對象類型,左邊可以指定對象類型的基本屬性,右邊有一系列標簽頁,可以定義類的屬性,類的關聯等內容。創建一個類,系統會自動生成一些基本屬性,如ID,創建人,創建時間,修改人,修改時間等。在屬性標簽頁可以添加物料的自定義屬性,如物料的“編碼”、“名稱”等。在數據庫中將自動按模型生成表Material,用來存儲“物料”對象類型的實例數據。
圖 創建“物料”類型界面
關于Material類有一些有趣的選項。“不可創建對象實例”相當于面向對象語言類的“Abstract”修飾符,如果勾選則不允許創建當前對象類型的實例;“不可添加子類型”類似面向對象語言類的“sealed”修飾符,如果勾選,則不允許創建當前類型的子類型;“版本策略”定義了該類型的實例是否具有版本。
5 創建子對象類型
繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關系。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,并加入若干新的內容。
在平臺中,可以直接為已有的對象類型添加子類型,子類型可以繼承父類型的一切特性。如下圖,通過物料類上的右鍵菜單可以新建子對象類。
圖 為“物料”類型添加子類型
如下圖,在制造業企業中,零部件屬于一種特殊的物料,在建模的時候,將part建模為material對象類型的子類型。下圖顯示如何在屬性標簽頁對零部件的屬性進行擴展,例子中添加了零部件的“材料”,零部件的“重量”等屬性。
圖 定義零部件子類型
通過這種方式,可以生成類型的層次結構,比如 :
圖 定義好物料的所有子類型
6 繼承關系在數據庫中如何存儲
關系型數據庫不支持繼承關系,解決繼承關系的對象類的數據的存儲一般有三種模式,分別是“單表模式”、“多表增量模式”、“多表獨立模式”。幾種模式比較如下:
我們的平臺同時支持多種存儲模式,在創建基類型時,可以定義該類型的存儲模式,應該根據各種數據管理的需求的特定選擇合適的存儲類型。
7 定義枚舉類型
如果一個變量你需要幾種可能存在的值,那么就可以被定義成為枚舉類型。之所以叫枚舉就是說將變量或者叫對象可能存在的情況也可以說是可能的值一一例舉出來。
在數據建模時大量存在各類枚舉類型,比如“國家”就應該一個枚舉類型,其中包括了數百個值,“星期”也是枚舉類型,包括從“周一”到“周日”7個值。下圖定義了零部件類型所包含的枚舉值。
圖 定義枚舉類型“零部件類型”
為了便于理解,平臺中我們成為列表類型,是一個概念。平臺內部可以支持基本數據類型也被定義為枚舉類型,如下圖:
圖 預定義枚舉類型“數據類型”
通過平臺提供的建模工具,可以方便的定義各種枚舉類型,如下圖:
圖:通過建模定義出來的部分枚舉類型
如何使用枚舉類型建模呢,在定義對象類型的屬性時,可以添加枚舉類型的屬性,如下圖所以:
圖 為零件定義枚舉類型的屬性“零部件類型”
創建某個零部件時,零部件類型屬性編輯的效果如下圖:
圖 某個零件實例的零部件類型
8 創建關聯類型
關聯類也是一種Item Type,具有類的一切特性,比如可以定義屬性,可以再定義關聯的關聯,可以為關聯類型添加子類型等。通過關聯可以實現一對一,一對多,多對多的類型之間的關系。一對一比較簡單,這里僅對一對多和多對多進行介紹。
假設系統已定義了供應商類、設備類,在管理管理時需要管理每臺設備的供應商,一般來說,一臺設備只有一個供應商,而一個供應商可以供應多臺設備,則關系建立在設備那邊。為“設備”類型添加一個屬性“供應商”,其數據源指向“供應商”數據類型。
圖 實現一對多的關系
在模型中有兩種方式可以對一對多的關系,這里不展開介紹,下面介紹一下如何定義多對多的關系。在介紹之前先介紹一下BOM(Bill of Material)的概念,BOM的中文意思是物料清單,是描述產品和部件結構的層次結構的數據,通常以表格的方式進行顯示和編輯,每個節點可以在包含BOM結構形成產品結構樹。通過這個定義看到BOM是一個“物料”類型的自關聯。
圖 通過BOM關聯類定義“物料”到“物料”的自關聯
B OM作為一個關聯類應該可以擴展屬性,比如一個汽車有多少個輪子,其中“個數”就屬于關聯的屬性。所以打開關聯類BOM,擴展BOM類的屬性。
圖 為BOM關聯類定義“數量”等屬性
通過建模,系統自動生成了零部件編輯的UI界面,默認的效果如下:
圖 系統自動生成了零部件編輯的UI界面
上圖所示的“上箱體組件”是一個零件類型的實例,而BOM 關系是定義在物料類型和物料類型之間的,為什么零件類型也可以編輯BOM結構呢?很簡單,因為零件類型是物料類型的子類型,零件類型繼承了來自物料類型的關聯定義。
在編輯“上箱體組件”時,可以從現有的從現有的物料庫中選擇添加,界面顯示如下:
圖 從物料類及其子類的實例中選擇實例添加到BOM表中
是不是很簡單,通過鼠標,不寫一行代碼,就可以完成數據結構的定義,系統自動生成相關的界面。當然您可能會對自動生成的界面不滿意,您可以通過現有平臺提供二次開發能力進行個性化定制。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載