前言近期做新專案,在設計表結構的時候,突然想起來之前面試的時候遇到的乙個問題,那時候也是初出茅廬,對很多東西一知半解(當然現在也是),當時那個小哥哥問我為什麼交易和退款要拆成兩個表?是基於什麼考慮?有什麼好處和優點麼?那是乙個風和日麗的下午,當然,風和日麗的下午應該配點其他的形容詞,實在是我才疏學淺,只能用這個詞充當了下開頭…… (此處省略小五千字)
趕緊進入正文!
因為之前一直做聚合支付,而在使用過程中,也是支付和退款表拆開的,一直這麼用,並沒有覺得不妥。
比如乙個交易表基本就是這樣的:
字段型別
含義id
bigint
主鍵 id
trans_id
varchar
交易訂單號
trans_amount
bigint
訂單金額
trans_status
tinyint
交易狀態
…………
……create_time
datetime
建立時間
update_time
datetime
更新時間
退款表也差不多就是這樣:
字段型別
含義id
bigint
主鍵 id
refund_id
varchar
退款訂單號
origin_trans_id
varchar
原始交易訂單號
refund_status
tinyint
退款狀態
refund_amount
bigint
退款金額
…………
……create_time
datetime
建立時間
update_time
datetime
更新時間
大概兩個表就是這樣子的吧!像一些其他欄位就先省略了,平常用著也覺得沒什麼。
但是恰好那次那個小哥哥就問了這個問題,支付和退款為什麼要分開記錄?
當時也是確實是實力不允許,我只是說了就是這麼用的,把正向流程和逆向流程拆開,分開實現邏輯,比較方便。
對賬需要
對賬戶而言,出款表和入款表最後兩方的金額是能對的上的,也就是說收支平衡。
當然這個記在乙個表裡也是完全可以的。畢竟對出入賬只是流水沒有狀態變化,比如出賬中,入賬中,等等,流水表完全可以記在乙個裡面,然後用字段進行標識是出賬還是入賬。
拆表需要
在網上看資料經常會說分庫分表,而像訂單這種(交易/退款)完全兩種業務,使用兩張表相對而言比較合適,畢竟交易的訂單相比退款訂單要多的多。
字段設計
交易和退款是完全不同的兩種業務,不像賬戶流水就是資金記錄。
交易除了訂單狀態還有一些交易資訊比如商戶號、優惠金額、實付金額、交易渠道、商品 id 名稱、備註等各種資訊。
退款則是根據原單進行退款,需要記錄原始訂單號、退款金額(部分退款)、退款資訊等。
雖然交易和退款總體上都包含 訂單號、狀態、金額等,但是如果強行放在乙個表,就會導致以下問題:
很多欄位為空的情況,比如交易不需要原始訂單號,退款需要儲存原始訂單號。本來可以設定索引來提高查詢效率的字段也不太合適設定了。
狀態也不一定可以完全相容,像交易狀態和退款狀態就很難互相相容。
開發效率
交易和退款分開之後,兩個人負責不同的業務進行開發,包括業務邏輯和查詢展示。如果放在一起,就很多字段不能保證別人知道有還是沒有,是儲存還是不儲存,畢竟表裡設定的都可以為空。這種情況下需要很多溝通,或者乾脆乙個人進行開發。
設計模式及原則
其他從設計模式及原則的角度上來說,可以說是職責單一,當然再高大上偏理論的我這就扯不出來了。
q&aq: 那前端要將兩種甚至多種在乙個列表展示該如何處理?
當然,如果前端分 tab 頁,分開展示不同的業務,那對後端來說簡直不要太友好。不過實際往往不是這樣,這時候就需要將訂單統一儲存。
在訂單成功的時候儲存到乙個公共儲存中,可以通過 mq 等,將資料保送到另一張表/庫,或者 es 中用來儲存。這樣訂單查詢還可以和業務邏輯的表/庫分開。也可以通過 binlog 進行處理,這裡的方案只做參考。
結束語之所以寫這篇文章,也是為了總結一下最近工作中遇到的問題,以及處理方法。同時一瞬間想起來了很久前遇到的相同的問題。
你有沒有想過為什麼交易和退款要拆開不同的表?
前言近期做新專案,在設計表結構的時候,突然想起來之前面試的時候遇到的乙個問題,那時候也是初出茅廬,對很多東西一知半解 當然現在也是 當時那個小哥哥問我為什麼交易和退款要拆成兩個表?是基於什麼考慮?有什麼好處和優點麼?那是乙個風和日麗的下午,當然,風和日麗的下午應該配點其他的形容詞,實在是我才疏學淺,...
有沒有想過,你為何要設計字型?
有沒有想過,你為何要設計字型?嗯,你會脫口而出,字型設計也是設計專業裡的一項技能。字型設計好,當然能提公升自己的核心競爭力啊。沒錯。再細想一下,字型設計的運用主要在哪些場景裡?1.中文字庫裡的設計 2.logo設計中的字型部分 或是字型樣式的logo 3.書籍唱片的封面 海報和電商中專題活動頁的設計...
有沒有想過你在電飯鍋上可以上校內?
這篇日誌呢更多上算是科技類的文章,不喜勿入 這篇文章呢更多上算是一點構想,或是單純的瞎想,不對勿噴 歡迎討論和指點 正如標題所說,你有沒有想過在電飯鍋或是電冰箱上面織圍脖上校內?看起來不太現實,我也不怎麼信 不得不承認乙個事實,這個世界徹徹底底的吧被網路所包圍了。很難想象如果網路中斷一天,世界會是什...