你有沒有想過為什麼交易和退款要拆開不同的表?

2021-10-09 14:32:46 字數 2331 閱讀 3215

前言近期做新專案,在設計表結構的時候,突然想起來之前面試的時候遇到的乙個問題,那時候也是初出茅廬,對很多東西一知半解(當然現在也是),當時那個小哥哥問我為什麼交易和退款要拆成兩個表?是基於什麼考慮?有什麼好處和優點麼?

那是乙個風和日麗的下午,當然,風和日麗的下午應該配點其他的形容詞,實在是我才疏學淺,只能用這個詞充當了下開頭…… (此處省略小五千字)

趕緊進入正文!

因為之前一直做聚合支付,而在使用過程中,也是支付和退款表拆開的,一直這麼用,並沒有覺得不妥。

比如乙個交易表基本就是這樣的:

字段型別

含義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.書籍唱片的封面 海報和電商中專題活動頁的設計...

有沒有想過你在電飯鍋上可以上校內?

這篇日誌呢更多上算是科技類的文章,不喜勿入 這篇文章呢更多上算是一點構想,或是單純的瞎想,不對勿噴 歡迎討論和指點 正如標題所說,你有沒有想過在電飯鍋或是電冰箱上面織圍脖上校內?看起來不太現實,我也不怎麼信 不得不承認乙個事實,這個世界徹徹底底的吧被網路所包圍了。很難想象如果網路中斷一天,世界會是什...