建模知識在實際設計中的應用(下)
本篇主要嘮嘮建模知識在日常工作、實際設計中的應用。
以下為上篇總結(jié),補充在此;
- 角色矩陣、系統(tǒng)主流程以及狀態(tài)圖,三者之間相互補充與制衡,最終達到完美的統(tǒng)一;
- 狀態(tài)圖梳理后調(diào)整補充系統(tǒng)主流程,系統(tǒng)主流程調(diào)整后調(diào)整補充角色矩陣;
- 同樣,角色矩陣也限制、指導著系統(tǒng)的主要功能,防止在梳理需求時被無限放大;
相關(guān)閱讀:
數(shù)據(jù)庫建模知識:在需求獲取與分析中的應用(上)
一、原型線框圖
在角色矩陣、系統(tǒng)主流程和狀態(tài)圖達到統(tǒng)一后,接下來就來到原型設計的階段,此階段的主要目的是把每個實體的屬性以及實體之間的聯(lián)系,以我們?nèi)粘?梢姟⒗斫獾姆绞匠尸F(xiàn);
1.1 模塊劃分
- 基礎模塊的劃分遵循實體的界限,一般來說,一個實體就是一個基礎模塊,通常模塊首頁以列表形式展示;如普通的電商后臺系統(tǒng),即用戶、商品、訂單這些基礎模塊,這些其實也是實體;
- 統(tǒng)計,關(guān)聯(lián)類,根據(jù)實際需求定義模塊,通常以圖表、列表形式展示;
1.2 站點地圖
系統(tǒng)涉及到的頁面以及頁面之間的流轉(zhuǎn)以地圖索引的方式展示;一般以模塊劃分,如系統(tǒng)功能較簡單,可以系統(tǒng)為單位。
1.3 頁面信息架構(gòu)
即頁面呈現(xiàn)的信息,從建模角度來看,其實就是實體屬性以及實體之間聯(lián)系的展示;
實體屬性,即實體的基本屬性,比如員工有員工號、姓名、身份證號、職位、性別、郵箱等基本屬性;實體之間的聯(lián)系,即該實體與其他實體之前的聯(lián)系,如我們在上篇中寫到的部門-人員的關(guān)系;
- 1:1,當實體之間為1:1的聯(lián)系時,當前實體的頁面展示可以將對面實體以其屬性的形式展示;如某公司業(yè)務支撐部,經(jīng)理張三,在員工基本信息頁,職位:部門經(jīng)理,部門:業(yè)務支撐部;在部門基本信息查看時,部門:業(yè)務支撐部,部門經(jīng)理:張三;
- 1:N,當實體之間為1:N的聯(lián)系時,為“1”的實體頁面信息展示時,可以將對面的“N”以下級頁面或列表的形式展示;為“N”的實體頁面信息展示時,可以將對面的“1”以其屬性的形式展示;如業(yè)務支撐部下屬員工有2個,分別是小麗、小黃,查看業(yè)務部信息時,可以設置“下屬員工”鏈接到下級頁面,也可以以列表的形式展示這2個員工信息。同理,在員工基本信息頁面時,可以將該員工的所在/所屬部門以其基本屬性展示;
- N:N,當實體之間為N:N的聯(lián)系時,對面實體以下級頁面或列表的形式展示;如學生-課程,在學生模塊,可以將所選課程以下級頁面的形式展示,也可以以列表的形式展示;同理在課程模塊,該課程被哪些學生選修,可以以下級頁面展示,也可以以列表的形式展示;
二、設計原則
2.1 始終把“用戶+需求”放在第一位
- 用戶:即該系統(tǒng)的最終用戶,可遵循我們在上兩篇中講到的角色實體;
- 需求:即功能,用戶通過系統(tǒng)想要達到的目的;
- 用戶+需求:即考慮該功能的實際應用場景,根據(jù)實際場景把控設計的方向;
實際場景應考慮的因素如下,持續(xù)補充:
- 用戶年齡大小,這直接影響到視覺上的配色、字體、字號等;
- 用戶整體素質(zhì)水平,在流程跳轉(zhuǎn)、提示等節(jié)點盡量簡潔易懂;
- 用戶所處環(huán)境,用戶是處在比較莊嚴的機關(guān)單位還是新潮的互聯(lián)網(wǎng)行業(yè),都有一套行業(yè)規(guī)則;
- 功能使用周期、頻率;這直接影響到表結(jié)構(gòu)的設計,在大頻率的功能上,訪問速度是需要著重考慮的問題;
2.2 遵循“高內(nèi)聚,低耦合”的設計原則
這應該是我從大學,老師就一直強調(diào)的,就像一項指明燈指引我們前進;你會發(fā)現(xiàn),所有不好用的設計邏輯,都會忽略這個原則。
官方解釋:
高內(nèi)聚:又稱塊內(nèi)聯(lián)系。指模塊的功能強度的度量,即一個模塊內(nèi)部各個元素彼此結(jié)合的緊密程度的度量。若一個模塊內(nèi)各元素(語名之間、程序段之間)聯(lián)系的越緊密,則它的內(nèi)聚性就越高。
低耦合:一個完整的系統(tǒng),模塊與模塊之間,盡可能的使其獨立存在。也就是說,讓每個模塊,盡可能的獨立完成某個特定的子功能。模塊與模塊之間的接口,盡量的少而簡單。
官方給出的解釋中,主要是針對模塊之間,實際上,這個結(jié)論對大至平臺,小至實體都是適應;
下面舉個關(guān)于實體之間的栗子:我之前接過的一個項目,其中有一條這樣的邏輯“一個經(jīng)銷商下最多3個聯(lián)系人”;這時我們會疑問,為啥會有這種設定, 這樣的規(guī)則在后續(xù)會產(chǎn)生哪些問題呢:
- 當經(jīng)銷商下聯(lián)系人超過3個時,系統(tǒng)是不支持的;
- 系統(tǒng)是由簡到繁的過程,一開始設定這樣的限制,如果后面想在撤銷這種設定的話會涉及很多改動;
實體之間不夠獨立且依賴太多,所以這不遵循高內(nèi)聚低耦合的原則; 其實這就是簡單的1:N的關(guān)系,只是在某些特定方式下,如導入經(jīng)銷商及其聯(lián)系人的時候,這時我們可以設定這個聯(lián)系人最多是3個,但是,在系統(tǒng)的使用中,這種關(guān)系反而是一種負擔;
2.3 遵循“復用性”原則,所有設計力求復用最優(yōu)化
官方解釋:
可復用性,復用又叫重用,是重復使用的意思。復用的好處可以得到 較高的生產(chǎn)效率以及隨之而來的成本降低、較高的軟件質(zhì)量(錯誤可以更快的被糾正)以及 恰當?shù)氖褂脧陀每梢愿纳葡到y(tǒng)的可維護性。
模塊之間的復用,即實體的復用,當實體之間是N:N的關(guān)系時,一定會存在這樣的復用關(guān)系;如果不存在,那這個設計可能沒有達到復用最優(yōu)化的標準;
如我們常見的組件與商品的關(guān)系,是N:N,在商品新建時會以屬性的方式增加組件;
這樣做的好處是:
- 組件不需要重復新建,直接在商品新增時引用加入即可;
- 可對組件進行管理、控制;
如果我們換一種設計思維,如新建商品時,一個個編輯填寫組件信息,這樣做會帶來
- 如不同商品的組件信息相同時,要重復錄入;
- 組件是以屬性的方式附屬在商品上,達不到組件可控可管的需求;
階梯性關(guān)聯(lián)關(guān)系的設計,即多個實體之間有階梯性關(guān)聯(lián)關(guān)系,建議采用斷層式數(shù)據(jù)結(jié)構(gòu)設計,不建議跨級發(fā)生聯(lián)系,即使需要跨級也要把中間那層關(guān)系加上;
為了便于理解,以下實例奉上。
背景:項目-經(jīng)銷商是N:N的關(guān)系,經(jīng)銷商-聯(lián)系人是1:N的關(guān)系;
需求1:當項目新增成功后,會根據(jù)一定條件匹配經(jīng)銷商,確認此項目可能推送的經(jīng)銷商,或者叫預推送;此時的預推送表結(jié)構(gòu)的設計應該是項目-經(jīng)銷商,而不是項目-聯(lián)系人或項目-經(jīng)銷商-聯(lián)系人;這樣設計的好處有,
- 我們只固定了前半邊的關(guān)系,后面的關(guān)系可以通過經(jīng)銷商來匹配帶出,當經(jīng)銷商人員發(fā)生變更時也不會有任何影響;如果采用其他方式,在經(jīng)銷商人員變更時會多出很多復雜的數(shù)據(jù)操作,以保證此功能不受影響;
- 經(jīng)銷商-聯(lián)系人是1:N的關(guān)系,插入一條項目-經(jīng)銷商關(guān)系就要插入多條項目-聯(lián)系人或項目-經(jīng)銷商-聯(lián)系人的關(guān)系,從數(shù)據(jù)的冗余角度考慮,也是項目-經(jīng)銷商的關(guān)系比較適合;
需求2:項目推送,項目預推送匹配成功后,可以對項目進行推送,這是真正的推送,有了這條推送,聯(lián)系人才能在前端看到對應的項目;而此時的設計應該是如何呢
答案是,項目-經(jīng)銷商-聯(lián)系人;為什么會加入“經(jīng)銷商”呢?前面的背景也說到,項目與聯(lián)系人其實是沒有這種關(guān)系的,他們產(chǎn)生關(guān)系的載體其實就是“經(jīng)銷商”;這樣做的好處是
- 明確該聯(lián)系人時通過什么載體(即經(jīng)銷商)來獲得這從推送關(guān)系的,當聯(lián)系人與載體的關(guān)系發(fā)生變更時,有個依據(jù)來對關(guān)聯(lián)數(shù)據(jù)進行相關(guān)操作;如聯(lián)系人從載體A變更到B,那此時,聯(lián)系人當時通過A獲得的項目推送關(guān)系就應該刪除;
- 相反的,如果不加入“經(jīng)銷商”的載體,那聯(lián)系人可見的項目是只增不減,因為我們沒有這個載體的依據(jù)去操作數(shù)據(jù);
注:一切實際需求為標準,僅供參考;
三、日常設計要點
3.1 保持對需求的嚴謹態(tài)度
雖然需求多如牛毛,產(chǎn)品累成狗(微笑),但我們也要始終保持一顆嚴謹、謙遜的態(tài)度;做軟件的都知道,即使是一個很小的需求,他的改動有時也不一定比一個大的需求少;所以,在需求被提出時,我們要保證我們已經(jīng)了解到該需求的所有細節(jié),以及涉及到的所有改動點;
3.2 盡量囊括所有擴展場景
好的產(chǎn)品,流程極簡且不容易發(fā)生異常;為什么說不容易呢,因為即使是神,也有考慮不周的地方,所以在設計時,應盡量囊括所有場景。
(1)外部條件導致的異常如斷網(wǎng)、服務掛掉等,應給出合適的提示信息;
(2)另外還有一種,即在常規(guī)流程外的分支流程,這個是特別需要我們注意且控制的。
- 重復提交:提交按鈕沒有控制可用狀態(tài)&&頁面流程較慢的情況下會出現(xiàn)多次重復提交的現(xiàn)象,一般前端+后臺,雙重控制,杜絕重讀提交;
- 流程異常,無法繼續(xù)走下去:充分考慮擴展場景,避免出現(xiàn)操作異常,即使異常,也應給出相關(guān)提示,指導用戶繼續(xù)走下去。
3.3 模塊關(guān)聯(lián)性,版本規(guī)劃
模塊、需求,都有可能產(chǎn)生關(guān)聯(lián),有前后的這種關(guān)系,這種情況應該考慮先規(guī)劃前置位的模塊或功能,然后再是后置位;版本的規(guī)劃,以系統(tǒng)核心模塊為基礎,遵從“關(guān)聯(lián)性模塊中的前置模塊,優(yōu)先級高于后置模塊”的規(guī)則,來規(guī)劃版本;
3.4 其他
(1)唯一性校驗,當實體有唯一性要求時,如用戶的手機號碼,身份證號等,在實體新增、修改時,校驗是否已存在、保證唯一性;
(2)關(guān)聯(lián)性關(guān)系,當刪除父節(jié)點時,子節(jié)點也會對應刪除或軟刪除;
(3)在對實體進行變更時,應首先以用戶的角色看問題;如已經(jīng)發(fā)出去的優(yōu)惠券,此時應設置不可再進行變更,因為發(fā)生變更后,用戶看到的將是更改后的優(yōu)惠券;
相關(guān)閱讀
數(shù)據(jù)庫建模知識:在需求獲取與分析中的應用(上)
作者:Andy。放松玩,專注思考的B端產(chǎn)品經(jīng)理。
本文由 @Andy 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
建模真的對產(chǎn)品的設計很重要,初次涉及產(chǎn)品的建模,存在一些疑問,可以加個微信,以后也互相交流(咳咳,其實是我想不要臉的求教 ?? )嗎?
哈哈,歡迎指正,我的電話同微信13512500038
讀完上、中、下,感同身受。流程圖,實體關(guān)聯(lián)圖,狀態(tài)圖也是我平時需求建模用得最多的。同是一枚B端產(chǎn)品 ??
歡迎指正,我算半個吧,目前做的都是小點的,后面想接觸體系級B端產(chǎn)品;