今天我們以 Acumatica ERP 的資料庫設計來切入,一起來看看這個 ERP 系統是如何達成 Multitenancy,讓各個子系統功能都可以分開來,個別獨立不打架吧!
我們在 Day 10 : ERP 系統的客製化開發與管理 中有提到,ERP 系統的架構大致上會是這樣作切分:
Acumatica ERP 的架構設計也是差不多,可以簡單把使用者使用的流程且分為這個流程圖:
(截於 Acumatica Developers Blog)
由左至右的步驟是:(1) 使用者藉由 Client 端發出請求後,經由 (2) HTTPS 協定來向 (3) IIS 網頁伺服器發出請求,進入 Acumatica ERP 系統內的三層架構,從 (4) 表現層、(5) 商業邏輯層 和 (6) 資料權限層,最後到 (7) 資料庫本體,拿到資料後就回傳給使用者。
而 Acumatica 內部的三層程式架構像是這樣:
(截於 Acumatica Developers Blog)
將整個 ERP 系統切成三層的架構,分為表現層 (Presentation Layer)、商業邏輯層 (Business Logic Layer) 和資料權限層 (Data Access Layer),其實和昨天的文章所介紹的 SAP ERP 架構大同小異。
我們在 Day 6 : 從網拍下訂單到出貨 - ERP 內的訂單 (Sales Orders) 中有介紹過銷售訂單的功能,一起來看看在 Acumatica ERP 中這個 Sales Orders 是怎麼設計的吧!
在 Acumatica 中,Sales Orders 畫面中分成上下兩層,我們可以稱為 FormView (上方的 form) 和 GridView (下方的 grid)。
FormView 裡最重要的資料是 OrderType 和 OrderNbr,分別代表了這個銷售訂單的類型 (可能是退換貨或是購買) 以及對應的訂單編號,除此之外還有對應的購買客戶、地點、購買日期等等的銷售訂單一定會有的資料。
打開直接打開資料庫設計看看長什麼樣子:
發現除了重要的訂單類型和訂單號碼之外,還有一個最重要的主鍵 CompanyID
。
(不同 CompanyID 中存放的銷售訂單資料)
因為在 Acumatica 裡,可以登入不同的子公司或國際公司,Acumatica 裡主要操控資料庫的 Data Access Layer,也就是官方自己設計的 DAC,就是使用這個 CompanyID 來切割隔離不同公司的資料。
如果使用者在其中的一家公司中,所有抓取即顯示的資料都會以這個 CompanyID 來當作區隔,顯示出來的資料就不會與其他公司的資料參在一起。 (例如 CompanyID=2)
如此一來,就可以區隔好每家公司不同的銷售訂單,做好 Multitenancy 而不會混用,讓公司可以更好的管理不同子公司間的銷售訂單。
Acumatica Developers Blog - Acumatica 6-tiers Web Architecture
Acumatica - Help and Training Examples on Github