數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)淺談
相信無論是產(chǎn)品經(jīng)理還是項(xiàng)目經(jīng)理,都遇到過項(xiàng)目數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)相關(guān)的事情,說說個(gè)人對(duì)于數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的理解。
工欲善其事必先其器,先給大家介紹幾個(gè)我比較熟悉數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的工具:
(1)Axure RP7.0
可以用來做用例及頁面原型設(shè)計(jì)。
頁面原型可以直接預(yù)覽查看。
(2)Visual Paradigm 13.0
可以用來做UML設(shè)計(jì),我個(gè)人比較喜歡用它來畫業(yè)務(wù)流程圖。
也可以用來做類圖,用例圖。不過導(dǎo)出數(shù)據(jù)字典的話就麻煩了。
(3)表結(jié)構(gòu)設(shè)計(jì)器EZDML
使用很方便,方便進(jìn)行表結(jié)構(gòu)設(shè)計(jì),重要的是可以直接導(dǎo)出數(shù)據(jù)字典。建表的時(shí)候中英文直接對(duì)照在一起。個(gè)人推薦表結(jié)構(gòu)設(shè)計(jì)用這個(gè)工具,后面例子的截圖都是使用這個(gè)工具做的。
其次,數(shù)據(jù)結(jié)構(gòu)必須有比較確定的業(yè)務(wù)實(shí)施范圍(業(yè)務(wù)用例)及用戶行為(業(yè)務(wù)活動(dòng)流程圖)。
有了以上結(jié)合頁面原型設(shè)計(jì),我們可以開始數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)了。
如何進(jìn)行數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
那數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)要怎么做呢?結(jié)合電商購物商城幫助大家進(jìn)行理解。
拿大家在網(wǎng)上買過東西,形成訂單管理流程為例,進(jìn)行一下簡單說明:
消費(fèi)者通過購買商品,填寫訂單信息,選擇優(yōu)惠信息,提交訂單,付款。商家進(jìn)行發(fā)貨,消費(fèi)者收貨,評(píng)價(jià),完成訂單交易。
第一要分析表結(jié)構(gòu)關(guān)系
第一要分析表結(jié)構(gòu)關(guān)系,消費(fèi)者和訂單的關(guān)系,訂單和商品的關(guān)系,商家和商品的關(guān)系,商家和訂單的關(guān)系,當(dāng)前購買場(chǎng)景下各自的關(guān)系。
1. 業(yè)務(wù)上有一對(duì)一,一對(duì)多,多對(duì)多3種關(guān)系
京東上一個(gè)消費(fèi)者可以購買多個(gè)商家的多個(gè)商品,一個(gè)商品當(dāng)前只會(huì)屬于一個(gè)訂單,可以同時(shí)對(duì)多個(gè)商家的商品合并結(jié)算,生成一個(gè)主訂單,多個(gè)子訂單。
淘寶上一個(gè)消費(fèi)者可以購買多個(gè)商家的多個(gè)商品,一個(gè)商品當(dāng)前只會(huì)屬于一個(gè)訂單,可以同時(shí)對(duì)多個(gè)商家的商品合并結(jié)算,生成多個(gè)訂單。
從消費(fèi)者購買的訂單來看,京東的訂單表結(jié)構(gòu)中存在父子結(jié)構(gòu)或者說訂單存在一對(duì)多的引用關(guān)系。淘寶的訂單表結(jié)構(gòu)中不存在自引用關(guān)系或者說父子訂單關(guān)系,
提到自引用關(guān)系,可以通過自引用達(dá)成樹結(jié)構(gòu)顯示。例如如菜單,用戶層級(jí),行政區(qū)域,訂單如果建立父子結(jié)構(gòu)也可以樹狀結(jié)構(gòu)顯示。
本文訂單表結(jié)構(gòu)邏輯參考淘寶,即消費(fèi)者一次購買過程中,按商家生成訂單,一個(gè)訂單可以購買多件商品,即訂單有子表訂單項(xiàng),一個(gè)訂單可以有多個(gè)訂單項(xiàng)。
*此流程中沒有多對(duì)多關(guān)系,若兩個(gè)對(duì)象之間存在多對(duì)多的關(guān)系,則應(yīng)消除這種關(guān)系。消除的辦法是,在兩者之間增加第三個(gè)對(duì)象。這樣,實(shí)現(xiàn)一個(gè)多對(duì)多的關(guān)系,變?yōu)閮蓚€(gè)一對(duì)多的關(guān)系。
舉個(gè)例子,在購買商品的詳情頁上顯示文章,一個(gè)文章可以涉及多個(gè)商品,一個(gè)商品可能和多篇文章有關(guān)。這時(shí)候我們就需要去消除多對(duì)多的關(guān)系。
第二是表的設(shè)計(jì)
2. 對(duì)象(表)的主鍵設(shè)計(jì)
- 流程中設(shè)計(jì)到的對(duì)象(表)主鍵Id皆用GUID類型。
- 不要用業(yè)務(wù)關(guān)系字段作為表的主鍵,更不要用組合字段做表的聯(lián)合主鍵。這樣便于將來表業(yè)務(wù)變化和表數(shù)據(jù)遷移,盡量減少依賴關(guān)系。
3. 弄清楚表里設(shè)計(jì)的每個(gè)字段
表里設(shè)計(jì)每個(gè)字段的時(shí)候一定要想清楚,這個(gè)字段什么時(shí)候插入,是否會(huì)更新,是否必須字段,整個(gè)表的數(shù)據(jù)是否可以刪除。是否要建立主外鍵關(guān)系。(結(jié)合頁面原型模擬用戶行為進(jìn)行判斷)
4. 數(shù)據(jù)結(jié)構(gòu)盡量簡單
可以計(jì)算得出的字段,前期建議不要插入。例如:訂單里的應(yīng)付總額,可以通過購買商品的單價(jià)和數(shù)量算出,這個(gè)總額不必存儲(chǔ)。
表里引用另一個(gè)表的主鍵作為外鍵,可以通過查詢得到值的,前期也不需要存儲(chǔ)。例如:訂單表里的收貨地址,包括省市區(qū)及詳細(xì)地址,只需要存儲(chǔ)地址ID,即可獲得詳細(xì)地址字段。
5. 枚舉設(shè)計(jì)
基本結(jié)構(gòu)里不需要維護(hù)的字段建議做成枚舉類型,不建議存儲(chǔ)。例如訂單狀態(tài)。比如訂單狀態(tài),已下單,已付款,已發(fā)貨,已收貨,已評(píng)價(jià),已完成。
6. 增加備注字段,以備不時(shí)之需。這里Order表里的Remarks字段。
7. 重要的基礎(chǔ)數(shù)據(jù)不要物理刪除
Order表里的Enable字段,控制數(shù)據(jù)有效性,這樣便于以后數(shù)據(jù)分析。
8. 下圖是訂單的表結(jié)構(gòu)設(shè)計(jì),訂單表結(jié)構(gòu)設(shè)計(jì)的另一個(gè)要點(diǎn)是,訂單是消費(fèi)者的消費(fèi)記錄,同時(shí)也是對(duì)商家結(jié)算的費(fèi)用依據(jù)。本設(shè)計(jì)里對(duì)訂單狀態(tài)是“已完成”的訂單進(jìn)行結(jié)算。
訂單業(yè)務(wù)流程里還有退款和退貨,本流程里退款和退貨有另外的表進(jìn)行設(shè)計(jì),再此不做闡述。
另外幾點(diǎn)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的技巧:
(1)復(fù)雜的邏輯關(guān)系可以考慮進(jìn)行抽象表結(jié)構(gòu)設(shè)計(jì),體現(xiàn)繼承關(guān)系,組合關(guān)系
繼承關(guān)系的數(shù)據(jù)結(jié)構(gòu),當(dāng)父對(duì)象抽象出來的字段,子對(duì)象不要再去創(chuàng)建,盡量保持父子鍵GUID相同。例如:user表有UserID,UserName,Customer繼承User表,Customer表的CustomerID要存儲(chǔ)為UserID的值。當(dāng)生成訂單時(shí),存儲(chǔ)UserID來獲得UserName即可,無需去調(diào)用Customer表。
(2)在數(shù)據(jù)冗余和處理速度之間找到合適的平衡點(diǎn)
冗余數(shù)據(jù)何時(shí)填入,可以依據(jù)業(yè)務(wù)經(jīng)驗(yàn)或者顧客提出的業(yè)務(wù)需求及項(xiàng)目維護(hù)時(shí)的數(shù)據(jù)監(jiān)測(cè)結(jié)果進(jìn)行調(diào)整。
最后,表結(jié)構(gòu)設(shè)計(jì)與業(yè)務(wù)流程和頁面原型息息相關(guān)??偟膩碚f,隨著開發(fā)進(jìn)展,業(yè)務(wù)不斷漸進(jìn)明細(xì),數(shù)據(jù)結(jié)構(gòu)也就漸漸穩(wěn)定下來了。
作者:陳蜀,無錫東方云峰科技有限公司項(xiàng)目經(jīng)理,7年項(xiàng)目管理經(jīng)驗(yàn),豐富的服裝、物流ERP管理軟件設(shè)計(jì)開發(fā)經(jīng)驗(yàn)。
本文由 @陳蜀 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來自 Pexels,基于 CC0 協(xié)議
以前沒有系統(tǒng)化梳理出來,受教了
深度好文,剛好用到,感謝