關(guān)于數(shù)據(jù)庫(kù)‘狀態(tài)’字段設(shè)計(jì)的思考與實(shí)踐

最近在做訂單及支付相關(guān)的系統(tǒng)炮障,在訂單表的設(shè)計(jì)階段宵距,團(tuán)隊(duì)成員就‘訂單狀態(tài)’數(shù)據(jù)庫(kù)字段設(shè)計(jì)有了一些分歧憾股,網(wǎng)上也有不少關(guān)于這方面的思考和探討,結(jié)合這些資料和項(xiàng)目的實(shí)際情況延届,擬對(duì)一些共性問(wèn)題進(jìn)行更深一層的思考剪勿,筆耕在此,和大家一起探討方庭。

問(wèn)題綜述

這里的分歧點(diǎn)即有團(tuán)隊(duì)內(nèi)部的分歧點(diǎn)厕吉,也有網(wǎng)絡(luò)上常見(jiàn)的一些分歧點(diǎn),先將存在的分歧點(diǎn)拋出來(lái):

1械念、訂單表的‘訂單狀態(tài)’字段對(duì)應(yīng)的字典值應(yīng)當(dāng)包含哪些狀態(tài)值头朱?對(duì)于‘已評(píng)論’、‘已退貨’龄减、’已退款’這類(lèi)狀態(tài)是放到‘訂單狀態(tài)’中项钮?還是獨(dú)立一個(gè)字段標(biāo)識(shí)?

2、訂單表的‘訂單狀態(tài)’字段對(duì)應(yīng)的字典值如何表示烁巫?可選項(xiàng)有:使用數(shù)字標(biāo)識(shí)署隘、使用多‘位’存儲(chǔ)方式標(biāo)識(shí)、使用具有明確業(yè)務(wù)含義的英文字符串標(biāo)識(shí)亚隙;

3磁餐、訂單表的‘訂單狀態(tài)’字段使用何種類(lèi)型?可選項(xiàng)有:number(N)阿弃、char(N)诊霹、varchar2(N);

如果嫌分析過(guò)程過(guò)于啰嗦,可以直接拉到最后看結(jié)論渣淳。

業(yè)務(wù)分析

我們先不去看問(wèn)題脾还,先來(lái)看看和‘訂單(Order)’實(shí)體相關(guān)的業(yè)務(wù)是怎樣的。下面我們會(huì)針對(duì)可能改變訂單實(shí)體狀態(tài)的行為已經(jīng)狀態(tài)變化的可能性進(jìn)行詳細(xì)的分析入愧。

訂單業(yè)務(wù)實(shí)體相關(guān)的業(yè)務(wù)流程如下:下單(create)--> 買(mǎi)家付款(pay)--> 賣(mài)家發(fā)貨(deliver)-->買(mǎi)家收貨(receive)-->退貨(rereturn)鄙漏;此外,還有退款(refund)和評(píng)論(comment)砂客,這兩個(gè)行為比較特殊泥张,其前向行為可能存在多個(gè)呵恢。

Figure0:訂單業(yè)務(wù)實(shí)體相關(guān)業(yè)務(wù)流程

首先鞠值,可以改變訂單業(yè)務(wù)狀態(tài)【這里的狀態(tài)不是指‘訂單狀態(tài)’(OrderState)這個(gè)數(shù)據(jù)庫(kù)字段,而是指實(shí)際業(yè)務(wù)狀態(tài)渗钉,我們簡(jiǎn)記為(BizState)彤恶,以和OrderState區(qū)分開(kāi)】的行為有哪些?按照典型電商的業(yè)務(wù)流程鳄橘,主要的行為(action)有:下單声离、付款、發(fā)貨瘫怜、收貨术徊、退款/退貨、評(píng)論鲸湃;每一種行為的發(fā)生赠涮,都會(huì)導(dǎo)致訂單的業(yè)務(wù)狀態(tài)BizState發(fā)生變化,比如‘下單’行為會(huì)創(chuàng)建訂單暗挑,‘付款’行為會(huì)使訂單變?yōu)椤迅犊睢癯l(fā)貨’行為可以使訂單狀態(tài)變?yōu)椤寻l(fā)貨’,‘收貨’行為會(huì)使訂單狀態(tài)變?yōu)椤咽肇洝桑u(píng)論’行為會(huì)使訂單狀態(tài)變?yōu)椤言u(píng)論’垃它。‘退款/退貨’action不是所有訂單都支持的,為減小復(fù)雜度国拇,暫不考慮它們洛史。

其次,細(xì)分下每種action對(duì)BizState帶來(lái)的影響酱吝,會(huì)發(fā)現(xiàn)還可以細(xì)分為四種子狀態(tài)(subState):action未開(kāi)始(標(biāo)記為0)虹菲、action進(jìn)行中(標(biāo)記為1)、action成功(標(biāo)記為2)掉瞳、action失敱显础(標(biāo)記為3);理論上陕习,將所有action的所有subState進(jìn)行排列得到4*4*4*4*4=1024(暫未考慮‘退貨’)霎褐;實(shí)際上,很多組合是沒(méi)有業(yè)務(wù)意義的该镣,是不可能存在的冻璃,比如‘未開(kāi)始已付款...’(***20)這一類(lèi)組合是不可能發(fā)生的,應(yīng)當(dāng)舍棄损合。用表格將上述的組合分析如下:

Table1省艳、多種action作用下的BizState組合情況

通過(guò)上表,我們可以發(fā)現(xiàn)些的規(guī)律:

‘下單’嫁审、‘付款’跋炕、‘發(fā)貨’、‘收貨’前四種action是存在依賴(lài)關(guān)系的律适,亦即后一個(gè)action依賴(lài)于前一個(gè)action的完成辐烂;所以,他們的SubState組合情況就會(huì)非常少捂贿;

‘評(píng)論comment’這個(gè)action的SubState和其他狀態(tài)組合會(huì)有很多種可能性纠修;除了前面了兩行是‘X’,后面是‘?’或者‘Y’厂僧,‘扣草?’是指需求上是否允許在對(duì)應(yīng)的BizState上進(jìn)行評(píng)論,如果允許颜屠,則每種BizState需要多出4種可能辰妙,這樣組合的可能性就會(huì)變得很大。

沒(méi)有業(yè)務(wù)意義的SubState組合被舍棄汽纤。表中的標(biāo)黑單元格上岗,表示這個(gè)BizState是毫無(wú)意義的,因?yàn)椤聪聠巍挠唵螌?duì)于我們來(lái)講是不存在的蕴坪,這類(lèi)組合需要舍棄肴掷;同樣的敬锐,還有很多其他的組合也是不存在的,被舍棄掉呆瞻,未展示在上表中台夺,如‘已下單已付款未發(fā)貨已收貨’這種。

通常某個(gè)action的SubState為‘1進(jìn)行中’痴脾、‘3失敗’時(shí)颤介,會(huì)被忽略,但也有例外赞赖;比如‘付款’action的‘3失敗’狀態(tài)滚朵,和‘付款’action的‘1進(jìn)行中’狀態(tài),具體分析見(jiàn)后面內(nèi)容前域。

忽略所有action的‘0未開(kāi)始’SubState狀態(tài)辕近。因?yàn)檫@類(lèi)SubState對(duì)于BizState不會(huì)帶來(lái)變化。

綜合下來(lái)匿垄,我們得到上表的BizState移宅,注意這里的Comment action未進(jìn)行細(xì)化處理,如果細(xì)化處理椿疗,會(huì)發(fā)現(xiàn)BizState的可能性會(huì)增大很多很多漏峰。

接下來(lái)我們就之前提出的這些問(wèn)題進(jìn)行逐個(gè)討論。

問(wèn)題一届榄、訂單表的‘訂單狀態(tài)’字段應(yīng)當(dāng)包含哪些狀態(tài)值浅乔?

什么樣的‘訂單業(yè)務(wù)狀態(tài)’(BizState)需要記錄到系統(tǒng)層面的‘訂單狀態(tài)’(OrderState)字段呢?如果記錄多了痒蓬,則系統(tǒng)處理的復(fù)雜度會(huì)增大童擎;記錄少了,那么‘訂單狀態(tài)’(OrderState)字段就不能完整的表示出訂單實(shí)體狀態(tài)變化情況攻晒。

核心狀態(tài)

通過(guò)上面的業(yè)務(wù)分析可知:大部分存在依賴(lài)關(guān)系的action(create、pay班挖、deliver鲁捏、receive),他們產(chǎn)生的合理的SubState組合是非常少的萧芙,而且他們之間的依賴(lài)是單向依賴(lài)给梅,狀態(tài)機(jī)的處理也很簡(jiǎn)單,因此双揪,我們先將這部分BizState納入到OrderState中:

等待買(mǎi)家付款

買(mǎi)家付款成功

賣(mài)家已發(fā)貨

買(mǎi)家已收貨

目前的訂單狀態(tài)流轉(zhuǎn):

Figure1:訂單狀態(tài)流轉(zhuǎn)圖--base

‘a(chǎn)ction行為’失敗的情況

對(duì)于action的SubState是‘3失敗’的處理动羽,需要針對(duì)不同的action進(jìn)行分析。類(lèi)似‘下單Create’這樣的action渔期,如果失敗运吓,則可以直接將OrderState置為‘訂單創(chuàng)建失敗’渴邦,因?yàn)镃reate action是第一個(gè)action,它的失敗意味著Order實(shí)體出生即死拘哨,BizState置為終態(tài)谋梭,對(duì)于這個(gè)BizState應(yīng)當(dāng)納入到OrderState中記錄,不過(guò)這個(gè)OrderState其實(shí)對(duì)于用戶(hù)并無(wú)多大用處倦青,因?yàn)橛脩?hù)并不會(huì)關(guān)心下單失敗的訂單瓮床,他更關(guān)心的是重新下單;

對(duì)于‘支付’失敗产镐,則要看需求隘庄,如果需求要求用戶(hù)可以繼續(xù)支付,則訂單需要保留癣亚,并且狀態(tài)仍然為‘等待買(mǎi)家付款’峭沦,如果不允許再支付,則理論上可以將BizState置為‘支付失敗’終態(tài)逃糟,所以吼鱼,‘支付失敗’的BizState終態(tài)也應(yīng)當(dāng)記錄到OrderState字段中。

對(duì)于‘發(fā)貨’失敗绰咽、‘收貨’失敗的情況菇肃,通常是不會(huì)發(fā)生的,即使發(fā)生也不屬于系統(tǒng)能夠控制的范疇取募,系統(tǒng)記錄并無(wú)意義琐谤,更具建設(shè)性的做法是通過(guò)線(xiàn)下手段盡快解決問(wèn)題,重新發(fā)貨等等玩敏,所以對(duì)于這些狀態(tài)系統(tǒng)的OrderState字段不予記錄斗忌。

這樣下來(lái)我們的OrderState字典值增加到6個(gè),加粗項(xiàng)為新增:

創(chuàng)建訂單失斖邸(終態(tài))

等待買(mǎi)家付款

買(mǎi)家付款失斨簟(終態(tài),依賴(lài)需求而定)

買(mǎi)家付款成功

賣(mài)家已發(fā)貨

買(mǎi)家已收貨

目前的訂單狀態(tài)流轉(zhuǎn):

Figure2:訂單狀態(tài)流轉(zhuǎn)圖--add '失敗'subState‘

‘a(chǎn)ction行為’進(jìn)行中的情況

對(duì)于action的SubState是‘1進(jìn)行中’的處理砰粹,同樣需要具體場(chǎng)景具體分析唧躲。‘付款’行為是用戶(hù)發(fā)起的碱璃,但是并不是和訂單系統(tǒng)之間的交互弄痹,涉及到支付系統(tǒng)的處理,這個(gè)領(lǐng)域也不是訂單系統(tǒng)可控的嵌器,但關(guān)系到錢(qián)肛真,用戶(hù)比較關(guān)系,所以對(duì)于這樣一個(gè)中間態(tài)爽航,我們需要記錄蚓让,以便用戶(hù)通過(guò)訂單系統(tǒng)查詢(xún)訂單狀態(tài)乾忱,為便于用戶(hù)理解,將此狀態(tài)在OrderState中記為‘付款確認(rèn)中’凭疮;‘發(fā)貨’‘收貨’進(jìn)行中的情況饭耳,不是訂單系統(tǒng)可以控制的領(lǐng)域,我們可以把他們當(dāng)著行為‘未開(kāi)始’處理执解,比如‘發(fā)貨進(jìn)行中’寞肖,訂單系統(tǒng)的OrderState值為‘買(mǎi)家已付款’,但給用戶(hù)看到的提示信息是‘買(mǎi)家已付款衰腌,等待賣(mài)家發(fā)貨’新蟆,實(shí)際上這時(shí)候賣(mài)家可能正在發(fā)貨中,但是用戶(hù)不會(huì)去關(guān)心到底有沒(méi)有打包好貨物什么的右蕊,所以這類(lèi)‘進(jìn)行中’狀態(tài)可以舍棄琼稻。這樣下來(lái)訂單系統(tǒng)的OrderState字段又多了一個(gè)字典值:‘付款確認(rèn)中’:

創(chuàng)建訂單失敗(終態(tài))

等待買(mǎi)家付款

付款確認(rèn)中

買(mǎi)家付款失斎那簟(終態(tài)帕翻,依賴(lài)需求而定)

買(mǎi)家付款成功

賣(mài)家已發(fā)貨

買(mǎi)家已收貨

目前的訂單狀態(tài)流轉(zhuǎn):

Figure3:訂單狀態(tài)流轉(zhuǎn)圖--add '進(jìn)行中'subState‘

‘a(chǎn)ction行為’未開(kāi)始的情況

忽略所有action的‘0未開(kāi)始’SubState狀態(tài)。因?yàn)檫@類(lèi)SubState對(duì)于BizState不會(huì)帶來(lái)變化萝风。

‘評(píng)論comment’的處理

最后嘀掸,再來(lái)看看‘評(píng)論comment’這個(gè)action。如果需求上要求:只有買(mǎi)家收貨后才能發(fā)起‘評(píng)論’操作规惰,則可以任務(wù)‘評(píng)論comment’單向依賴(lài)于‘receive收貨’行為睬塌,那么可以將這個(gè)action的subState對(duì)應(yīng)的少量BizState(應(yīng)當(dāng)只有‘買(mǎi)家已評(píng)論’、‘賣(mài)家已評(píng)論’狀態(tài))納入OrderState字段統(tǒng)一記錄歇万;但是如果需求是:買(mǎi)家在下單后就可以開(kāi)始評(píng)論揩晴,比如如果賣(mài)家發(fā)貨慢了,買(mǎi)家可以上去吐槽贪磺,那么‘評(píng)論comment’就不是單向依賴(lài)于‘receive收貨’行為了硫兰,而是多向依賴(lài)于‘pay付款’、‘deliver發(fā)貨’缘挽、‘receive收貨’瞄崇,那么這些actions的subState組合可能性就暴增,BizState的字典取值也會(huì)暴增壕曼,顯然,不應(yīng)當(dāng)將這么多的BizState交給OrderState來(lái)記錄等浊,而應(yīng)當(dāng)由一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)字段負(fù)責(zé)記錄‘評(píng)論comment’的SubState腮郊,我們可以將這個(gè)字段取名為‘CommentState’(評(píng)論狀態(tài)),它的字典值不多筹燕,只有:‘未評(píng)論’轧飞、‘買(mǎi)家已評(píng)論’衅鹿、‘賣(mài)家已評(píng)論’;其實(shí)过咬,對(duì)于前一種需求大渤,也可以不講‘評(píng)論comment’對(duì)應(yīng)的SubState產(chǎn)生的BizState納入OrderState,因?yàn)橛脩?hù)對(duì)于評(píng)論與否其實(shí)并不是那么關(guān)心的掸绞,也就是說(shuō)‘評(píng)論comment’并不是核心業(yè)務(wù)流程泵三,為了降低核心業(yè)務(wù)流程的系統(tǒng)處理復(fù)雜度,將其從核心業(yè)務(wù)流程中剝離出來(lái)較好衔掸。

綜上烫幕,我們應(yīng)當(dāng)將‘評(píng)論comment’對(duì)應(yīng)的BizState獨(dú)立到一個(gè)字段中記錄。

‘退貨rereturn’的處理

再來(lái)看看‘退貨rereturn’行為對(duì)應(yīng)的BizState的處理群叶《魃蹋‘退貨rereturn’并不是所有訂單都會(huì)經(jīng)歷的哄尔,但是一旦涉及,則‘退貨rereturn’在業(yè)務(wù)流程上必定是單向依賴(lài)于單向依賴(lài)于‘receive收貨’捷犹,所以應(yīng)當(dāng)將‘退貨rereturn’產(chǎn)生的BizState(‘退貨中’、‘退貨成功’冕末,‘退款失敗’和‘未退貨’被忽略萍歉,見(jiàn)上面解釋?zhuān)┘{入OrderState一并記錄;這樣我們的OrderState有多了兩種字典值栓霜,這里我們不考慮一個(gè)訂單中有多種商品的情況翠桦,故把‘退貨成功'當(dāng)著終態(tài)處理,如果是一個(gè)訂單多種貨物的情況胳蛮,需要重新仔細(xì)分析销凑。加粗項(xiàng)為新增:

創(chuàng)建訂單失敗(終態(tài))

等待買(mǎi)家付款

付款確認(rèn)中

買(mǎi)家付款失斀龃丁(終態(tài)斗幼,依賴(lài)需求而定)

買(mǎi)家付款成功

賣(mài)家已發(fā)貨

買(mǎi)家已收貨

退貨中

退貨成功(終態(tài))

目前的訂單狀態(tài)流轉(zhuǎn):

Figure4:訂單狀態(tài)流轉(zhuǎn)圖--add rereturn subState

‘退款refund’的處理

最后來(lái)看下‘退款refund’行為對(duì)應(yīng)的BizState的處理。首先抚垄,我們需要知道‘退貨’和‘退款’是兩種不同的業(yè)務(wù)行為蜕窿,他們的關(guān)系是:通常意義上,‘退貨’必然導(dǎo)致‘退款’呆馁,但是‘退款’可以沒(méi)有‘退貨’的參與(這里不討論特殊情況桐经,比如對(duì)于虛擬貨物來(lái)講,付款成功通常以為著收貨成功浙滤,這時(shí)候就只能是在由‘退貨’導(dǎo)致‘退款’)阴挣,比如電商允許用戶(hù)付款成功后收到貨物前發(fā)起‘退款’。也就是說(shuō)‘退款refund’并不單向依賴(lài)于‘退貨rereturn’纺腊,和‘評(píng)論comment’一樣是多項(xiàng)依賴(lài)畔咧,所以茎芭,我們可以參考‘評(píng)論comment’的處理方式,單獨(dú)建立一個(gè)字段‘RefundState退款狀態(tài)’記錄‘退款refund’產(chǎn)生的BizState誓沸,這個(gè)狀態(tài)字段的字典值有:退款中梅桩,退款成功。

其他情況考慮

另外拜隧,可能還有一些增強(qiáng)型需求宿百,讓客戶(hù)體驗(yàn)更好,比如用戶(hù)可以創(chuàng)建訂單之后付款之前虹蓄,將訂單取消犀呼,或者由系統(tǒng)跑批將用戶(hù)長(zhǎng)時(shí)間未支付的訂單關(guān)閉,這會(huì)產(chǎn)生一種新的action——‘close關(guān)閉’薇组,對(duì)應(yīng)的會(huì)產(chǎn)生一種新的有意義的BizState——‘訂單關(guān)閉/取消’外臂,這個(gè)不屬于核心流程中的,且并無(wú)糾結(jié)之處律胀,不予詳細(xì)討論宋光,羅列如下:

創(chuàng)建訂單失敗(終態(tài))

等待買(mǎi)家付款

付款確認(rèn)中

買(mǎi)家付款失斕烤(終態(tài)罪佳,依賴(lài)需求而定)

買(mǎi)家付款成功

賣(mài)家已發(fā)貨

買(mǎi)家已收貨

退貨中

退貨成功(終態(tài))

訂單關(guān)閉(終態(tài))

結(jié)論

綜上,我們可以得出放入數(shù)據(jù)庫(kù)’訂單狀態(tài)‘字段的標(biāo)準(zhǔn):核心業(yè)務(wù)流程黑低,向前單向依賴(lài)赘艳。擴(kuò)展到其他業(yè)務(wù)實(shí)體是一樣的,這里說(shuō)的’訂單狀態(tài)‘字段實(shí)際是指該業(yè)務(wù)實(shí)體對(duì)應(yīng)的數(shù)據(jù)表的主業(yè)務(wù)狀態(tài)字段克握。我們把結(jié)論擴(kuò)展一下:

如果某個(gè)action屬于業(yè)務(wù)實(shí)體對(duì)應(yīng)的核心業(yè)務(wù)流程蕾管,且該action單向依賴(lài)于其前向的action,則需要將這個(gè)action產(chǎn)生的BizState放入到業(yè)務(wù)實(shí)體對(duì)應(yīng)的數(shù)據(jù)庫(kù)表的主狀態(tài)字段中記錄菩暗。

OrderState字段記錄的BizState業(yè)務(wù)狀態(tài)有10種掰曾,其中4種是終態(tài),其余狀態(tài)為中間態(tài)停团。這些狀態(tài)的流轉(zhuǎn)關(guān)系為:

Figure5:訂單狀態(tài)流轉(zhuǎn)圖--final

問(wèn)題二旷坦、訂單表的‘訂單狀態(tài)’字段的字典值的表示形式?

先列出可選項(xiàng):使用數(shù)字標(biāo)識(shí)佑稠、使用多‘位’存儲(chǔ)方式標(biāo)識(shí)秒梅、使用具有明確業(yè)務(wù)含義的英文字符串標(biāo)識(shí);對(duì)可選項(xiàng)做逐一解釋?zhuān)?br>

a舌胶、使用數(shù)字標(biāo)識(shí)——使用一個(gè)數(shù)字標(biāo)識(shí)一種狀態(tài)番电,并未要求是sequence的;如‘等待買(mǎi)家付款’表示為‘0’;

b辆琅、使用多‘位’存儲(chǔ)方式標(biāo)識(shí)——將某種行為是否發(fā)生對(duì)應(yīng)的狀態(tài)對(duì)應(yīng)到一個(gè)位上漱办,比如‘是否付款’定義在第一位,‘是否發(fā)貨’定義在第二位婉烟,‘是否收貨’定義在第三位娩井,‘是否評(píng)論’定義在第四位,則狀態(tài)‘賣(mài)家已收貨未評(píng)論’可以表示為:0111似袁;而‘等待買(mǎi)家付款’則表示為‘0000’洞辣;當(dāng)然這里的‘位’可能是二進(jìn)制的也可能是N進(jìn)制,后面我們?cè)敿?xì)討論昙衅。

c扬霜、使用具有明確業(yè)務(wù)含義的英文字符串標(biāo)識(shí)——該方案和方案a類(lèi)似,不過(guò)字典值變?yōu)榫哂忻鞔_業(yè)務(wù)含義的英文支付串而涉,如‘等待買(mǎi)家付款’表示為‘WAIT_BUYER_PAY’;

方案a是數(shù)據(jù)庫(kù)字段字典的慣用方式著瓶,簡(jiǎn)單直觀,但是有一個(gè)壞處在于:當(dāng)字典值較多時(shí)啼县,數(shù)據(jù)庫(kù)表的使用者記不住字典的含義材原,需要反復(fù)查找資料確認(rèn);有人會(huì)說(shuō)將字典值寫(xiě)到字段的注釋里季眷,這個(gè)在實(shí)踐中不是很靠譜余蟹,通常表建立后,如果字段增加了字典值子刮,通常開(kāi)發(fā)人員都會(huì)忽略更改字典值威酒;而且在使用工具(如pl/sql)查詢(xún)數(shù)據(jù)庫(kù)時(shí),并不會(huì)將所有字典值展示出來(lái)挺峡;

通過(guò)問(wèn)題一的分析葵孤,可知:方案b使用多‘位’存儲(chǔ)方式會(huì)增加復(fù)雜度,并沒(méi)有必要沙郭,可以通過(guò)將‘是否評(píng)論’狀態(tài)獨(dú)立成一個(gè)字段進(jìn)行表示佛呻。

方案c和方案a類(lèi)似,好處在于通過(guò)字典值直接知道業(yè)務(wù)含義病线,壞處在于會(huì)給編碼和手工查詢(xún)時(shí)帶來(lái)復(fù)雜度吓著,通常人們也記不住‘等待買(mǎi)家付款’的英文字典是‘WAIT_BUYER_PAY’,那么手動(dòng)寫(xiě)sql查詢(xún)‘等待買(mǎi)家付款’時(shí)就犯迷糊了送挑。

折中之后绑莺,我們組合方案a和方案c,得到方案d:另外建立一張字典表惕耕,存儲(chǔ):數(shù)字形式的字典值纺裁、字典英文名稱(chēng)、字典中文簡(jiǎn)稱(chēng)、字典解釋?zhuān)挥唵螌?shí)體表的OrderState字段使用數(shù)字作為字典值欺缘。

對(duì)于方案d栋豫,看到OrderState的數(shù)字形式狀態(tài)時(shí),可以先看看字段注釋是否有此字典的定義谚殊,如果沒(méi)有就取查下字典表丧鸯,得到字典值和含義;在編碼和手動(dòng)sql查詢(xún)時(shí)也會(huì)變得比較容易嫩絮,數(shù)字的位數(shù)畢竟要少些丛肢;建立字典表的其他好處還有:字典的解釋可以寫(xiě)的很詳細(xì),在報(bào)表中要求展示字典中文名時(shí)剿干,也能直接從數(shù)據(jù)庫(kù)聯(lián)表查詢(xún)得到蜂怎,而不必額外做一次映射。(有參考:數(shù)據(jù)庫(kù)表設(shè)計(jì)(狀態(tài)字段)

那么對(duì)于字典數(shù)量很少的狀態(tài)字段是否有必要額外新建一張字典表呢置尔?這個(gè)根據(jù)實(shí)際情況考慮杠步,通常可以先不建撰洗,如果后續(xù)有業(yè)務(wù)場(chǎng)景需要再行創(chuàng)建也不遲篮愉。

而對(duì)于非業(yè)務(wù)實(shí)體表的系統(tǒng)日志/跑批記錄表等的狀態(tài),則完全可以使用數(shù)字形式的字典差导,因?yàn)橥ǔ2粫?huì)有業(yè)務(wù)場(chǎng)景使用到這些字典值试躏,而且這些字典值域應(yīng)當(dāng)會(huì)比較小,所以沒(méi)有必要為他們創(chuàng)建單獨(dú)的字典表设褐。

綜上得出結(jié)論:

1颠蕴、字典值域較多、變化較多助析、報(bào)表等業(yè)務(wù)場(chǎng)景會(huì)使用到的業(yè)務(wù)實(shí)體表的業(yè)務(wù)狀態(tài)字段犀被,使用‘方案d:新建字典表’的方案處理;如‘訂單業(yè)務(wù)實(shí)體表’中的‘訂單狀態(tài)’字段外冀。

2寡键、字典值域較少、變化較少雪隧、報(bào)表等業(yè)務(wù)場(chǎng)景不會(huì)使用到的業(yè)務(wù)實(shí)體表的業(yè)務(wù)狀態(tài)字段西轩,使用‘方案a:使用數(shù)字標(biāo)識(shí)字典’的方案處理;如‘支付寶的支付流水表’的‘支付流水狀態(tài)’字段脑沿。

3藕畔、系統(tǒng)日志/跑批記錄表的狀態(tài)字段,使用‘方案a:使用數(shù)字標(biāo)識(shí)字典’的方案處理庄拇;如‘待收貨記錄表’的‘跑批狀態(tài)’字段注服。

問(wèn)題三韭邓、數(shù)據(jù)庫(kù)表的‘狀態(tài)’字段使用何種類(lèi)型

列出可選項(xiàng):number(N)、char(N)溶弟、varchar2(N)女淑,其中N是一個(gè)長(zhǎng)度值。

這個(gè)問(wèn)題主要需要考慮使用場(chǎng)景可很、擴(kuò)展性诗力、性能、存儲(chǔ)我抠。

‘狀態(tài)’字段主要使用在查詢(xún)場(chǎng)景,且通常是‘=’或者‘in’的查詢(xún)袜茧,并沒(méi)有區(qū)間類(lèi)的查詢(xún)菜拓,故三者差別不大;

對(duì)于性能笛厦,參考[原創(chuàng)]在Oracle 10g纳鼎,Number、Char和Varchar2類(lèi)型作為主鍵裳凸,查詢(xún)效率分析 char(N)贱鄙、varchar2(N)性能優(yōu)于number(N),故舍棄number(N)姨谷。

考慮到擴(kuò)展性逗宁,char(N)、varchar2(N)差不多梦湘;

考慮到存儲(chǔ)瞎颗,varchar2更加占用空間更小,故選擇varchar2(N)捌议。

綜上:選擇varchar2(N)作為數(shù)據(jù)庫(kù)‘狀態(tài)’字段的類(lèi)型哼拔。

問(wèn)題結(jié)論匯總

1、訂單表的‘訂單狀態(tài)’字段對(duì)應(yīng)的字典值應(yīng)當(dāng)包含哪些狀態(tài)值瓣颅?對(duì)于‘已評(píng)論’倦逐、‘已退貨’這類(lèi)狀態(tài)是放到‘訂單狀態(tài)’中?還是獨(dú)立一個(gè)字段標(biāo)識(shí)宫补?

如果某個(gè)action(行為檬姥,如支付)屬于業(yè)務(wù)實(shí)體對(duì)應(yīng)的核心業(yè)務(wù)流程,且該action單向依賴(lài)于其前向的action守谓,則需要將這個(gè)action產(chǎn)生的業(yè)務(wù)狀態(tài)放入到業(yè)務(wù)實(shí)體對(duì)應(yīng)的數(shù)據(jù)庫(kù)表的主狀態(tài)字段中記錄穿铆。

問(wèn)題中的‘已評(píng)論’由‘評(píng)論’行為產(chǎn)生,而‘評(píng)論’這個(gè)action并不是訂單業(yè)務(wù)實(shí)體的核心業(yè)務(wù)流程斋荞,且可能存在多個(gè)前向依賴(lài)action(支付荞雏、發(fā)貨、收貨等),所以應(yīng)當(dāng)獨(dú)立到一個(gè)字段標(biāo)識(shí)凤优。

問(wèn)題中的‘已退貨’由‘退貨’行為產(chǎn)生悦陋,而‘退貨’這個(gè)action是訂單業(yè)務(wù)實(shí)體的核心業(yè)務(wù)流程,用戶(hù)非常關(guān)心筑辨,且只單向依賴(lài)于‘收貨’action俺驶,所以應(yīng)當(dāng)記錄到訂單業(yè)務(wù)實(shí)體表的‘訂單狀態(tài)’字段中。

問(wèn)題中的‘已退款’由‘退款’行為產(chǎn)生棍辕,而‘退款’這個(gè)action是訂單業(yè)務(wù)實(shí)體的核心業(yè)務(wù)流程暮现,用戶(hù)非常關(guān)心,但是這個(gè)action存在多個(gè)前向依賴(lài)action(支付楚昭、發(fā)貨栖袋、收貨等),所以應(yīng)當(dāng)獨(dú)立到一個(gè)字段標(biāo)識(shí)抚太。

2塘幅、訂單表的‘訂單狀態(tài)’字段對(duì)應(yīng)的字典值如何表示?可選項(xiàng)有:使用數(shù)字標(biāo)識(shí)尿贫、使用多‘位’存儲(chǔ)方式標(biāo)識(shí)电媳、使用具有明確業(yè)務(wù)含義的英文字符串標(biāo)識(shí);

1庆亡、字典值域較多匾乓、變化較多、報(bào)表等業(yè)務(wù)場(chǎng)景會(huì)使用到的業(yè)務(wù)實(shí)體表的業(yè)務(wù)狀態(tài)字段身冀,使用‘方案d:新建字典表’的方案處理钝尸;如‘訂單業(yè)務(wù)實(shí)體表’中的‘訂單狀態(tài)’字段。

2搂根、字典值域較少珍促、變化較少、報(bào)表等業(yè)務(wù)場(chǎng)景不會(huì)使用到的業(yè)務(wù)實(shí)體表的業(yè)務(wù)狀態(tài)字段剩愧,使用‘方案a:使用數(shù)字標(biāo)識(shí)字典’的方案處理猪叙;如‘支付寶的支付流水表’的‘支付流水狀態(tài)’字段。

3仁卷、系統(tǒng)日志/跑批記錄表的狀態(tài)字段穴翩,使用‘方案a:使用數(shù)字標(biāo)識(shí)字典’的方案處理;如‘待收貨記錄表’的‘跑批狀態(tài)’字段锦积。

3芒帕、訂單表的‘訂單狀態(tài)’字段使用何種類(lèi)型?可選項(xiàng)有:number(N)丰介、char(N)背蟆、varchar2(N);

varchar2(N)占用存儲(chǔ)更少鉴分,且具有同等的性能、擴(kuò)展性带膀,選擇varchar2(N)作為數(shù)據(jù)庫(kù)‘狀態(tài)’字段的類(lèi)型志珍。

參考資料

數(shù)據(jù)庫(kù)表設(shè)計(jì)(狀態(tài)字段)

[原創(chuàng)]在Oracle 10g,Number垛叨、Char和Varchar2類(lèi)型作為主鍵伦糯,查詢(xún)效率分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嗽元,隨后出現(xiàn)的幾起案子敛纲,更是在濱河造成了極大的恐慌,老刑警劉巖还棱,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件载慈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡珍手,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)辞做,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琳要,“玉大人,你說(shuō)我怎么就攤上這事秤茅≈刹梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵框喳,是天一觀的道長(zhǎng)课幕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)五垮,這世上最難降的妖魔是什么乍惊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮放仗,結(jié)果婚禮上润绎,老公的妹妹穿的比我還像新娘。我一直安慰自己诞挨,他們只是感情好莉撇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著惶傻,像睡著了一般棍郎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上银室,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天涂佃,我揣著相機(jī)與錄音励翼,去河邊找鬼。 笑死巡李,一個(gè)胖子當(dāng)著我的面吹牛抚笔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侨拦,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼殊橙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了狱从?” 一聲冷哼從身側(cè)響起膨蛮,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎季研,沒(méi)想到半個(gè)月后敞葛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡与涡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年惹谐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驼卖。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氨肌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酌畜,到底是詐尸還是另有隱情怎囚,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布桥胞,位于F島的核電站恳守,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贩虾。R本人自食惡果不足惜催烘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望整胃。 院中可真熱鬧颗圣,春花似錦、人聲如沸屁使。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛮寂。三九已至蔽午,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酬蹋,已是汗流浹背及老。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工抽莱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骄恶。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓食铐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親僧鲁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虐呻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容