自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

運(yùn)維 數(shù)據(jù)庫運(yùn)維
" 近期做新項(xiàng)目,在設(shè)計(jì)表結(jié)構(gòu)的時(shí)候,突然想起來之前面試的時(shí)候遇到的一個(gè)問題,那時(shí)候也是初出茅廬,對(duì)很多東西一知半解(當(dāng)然現(xiàn)在也是),當(dāng)時(shí)那個(gè)小哥哥問我為什么交易和退款要拆成兩個(gè)表?是基于什么考慮?有什么好處和優(yōu)點(diǎn)么? "

[[342932]]

前言

" 近期做新項(xiàng)目,在設(shè)計(jì)表結(jié)構(gòu)的時(shí)候,突然想起來之前面試的時(shí)候遇到的一個(gè)問題,那時(shí)候也是初出茅廬,對(duì)很多東西一知半解(當(dāng)然現(xiàn)在也是),當(dāng)時(shí)那個(gè)小哥哥問我為什么交易和退款要拆成兩個(gè)表?是基于什么考慮?有什么好處和優(yōu)點(diǎn)么? "

1.背景

那是一個(gè)風(fēng)和日麗的下午,當(dāng)然,風(fēng)和日麗的下午應(yīng)該配點(diǎn)其他的形容詞,實(shí)在是我才疏學(xué)淺,只能用這個(gè)詞充當(dāng)了下開頭…… (此處省略小五千字)

趕緊進(jìn)入正文!

因?yàn)橹耙恢弊鼍酆现Ц叮谑褂眠^程中,也是支付和退款表拆開的,一直這么用,并沒有覺得不妥。

比如一個(gè)交易表基本就是這樣的:

字段 類型 含義
id bigint 主鍵 id
trans_id varchar 交易訂單號(hào)
trans_amount bigint 訂單金額
trans_status tinyint 交易狀態(tài)
…… …… ……
create_time datetime 創(chuàng)建時(shí)間
update_time datetime 更新時(shí)間

退款表也差不多就是這樣:

字段 類型 含義
id bigint 主鍵 id
refund_id varchar 退款訂單號(hào)
origin_trans_id varchar 原始交易訂單號(hào)
refund_status tinyint 退款狀態(tài)
refund_amount bigint 退款金額
…… …… ……
create_time datetime 創(chuàng)建時(shí)間
update_time datetime 更新時(shí)間

大概兩個(gè)表就是這樣子的吧!像一些其他字段就先省略了,平常用著也覺得沒什么。

但是恰好那次那個(gè)小哥哥就問了這個(gè)問題,支付和退款為什么要分開記錄?

當(dāng)時(shí)也是確實(shí)是實(shí)力不允許,我只是說了就是這么用的,把正向流程和逆向流程拆開,分開實(shí)現(xiàn)邏輯,比較方便。

2.個(gè)人見解

這里說的不僅僅是交易和退款,同時(shí)泛指正向交易和逆向交易,比如充值和消費(fèi),借款和貸款,賬戶出賬入賬等等,下面僅說說個(gè)人見解,只做討論,如果小伙伴有更好的說法,希望可以留言指出,共同學(xué)習(xí)。

對(duì)賬需要

對(duì)賬戶而言,出款表和入款表最后兩方的金額是能對(duì)的上的,也就是說收支平衡。

當(dāng)然這個(gè)記在一個(gè)表里也是完全可以的。畢竟對(duì)出入賬只是流水沒有狀態(tài)變化,比如出賬中,入賬中,等等,流水表完全可以記在一個(gè)里面,然后用字段進(jìn)行標(biāo)識(shí)是出賬還是入賬。

拆表需要

在網(wǎng)上看資料經(jīng)常會(huì)說分庫分表,而像訂單這種(交易/退款)完全兩種業(yè)務(wù),使用兩張表相對(duì)而言比較合適,畢竟交易的訂單相比退款訂單要多的多。

字段設(shè)計(jì)

交易和退款是完全不同的兩種業(yè)務(wù),不像賬戶流水就是資金記錄。

交易除了訂單狀態(tài)還有一些交易信息比如商戶號(hào)、優(yōu)惠金額、實(shí)付金額、交易渠道、商品 id 名稱、備注等各種信息。

退款則是根據(jù)原單進(jìn)行退款,需要記錄原始訂單號(hào)、退款金額(部分退款)、退款信息等。

雖然交易和退款總體上都包含 訂單號(hào)、狀態(tài)、金額等,但是如果強(qiáng)行放在一個(gè)表,就會(huì)導(dǎo)致以下問題:

很多字段為空的情況,比如交易不需要原始訂單號(hào),退款需要存儲(chǔ)原始訂單號(hào)。本來可以設(shè)置索引來提高查詢效率的字段也不太合適設(shè)置了。

狀態(tài)也不一定可以完全兼容,像交易狀態(tài)和退款狀態(tài)就很難互相兼容。

開發(fā)效率

交易和退款分開之后,兩個(gè)人負(fù)責(zé)不同的業(yè)務(wù)進(jìn)行開發(fā),包括業(yè)務(wù)邏輯和查詢展示。如果放在一起,就很多字段不能保證別人知道有還是沒有,是存儲(chǔ)還是不存儲(chǔ),畢竟表里設(shè)置的都可以為空。這種情況下需要很多溝通,或者干脆一個(gè)人進(jìn)行開發(fā)。

設(shè)計(jì)模式及原則

其他從設(shè)計(jì)模式及原則的角度上來說,可以說是職責(zé)單一,當(dāng)然再高大上偏理論的我這就扯不出來了。

3.總結(jié)

Q&A

Q: 那前端要將兩種甚至多種在一個(gè)列表展示該如何處理?

A: 在很多 APP 中大家看到的多種訂單都是在一個(gè)列表里面展示出來的,比如:支付寶的賬單頁面。

當(dāng)然,如果前端分 tab 頁,分開展示不同的業(yè)務(wù),那對(duì)后端來說簡(jiǎn)直不要太友好。不過實(shí)際往往不是這樣,這時(shí)候就需要將訂單統(tǒng)一存儲(chǔ)。

 

在訂單成功的時(shí)候存儲(chǔ)到一個(gè)公共存儲(chǔ)中,可以通過 MQ 等,將數(shù)據(jù)保送到另一張表/庫,或者 ES 中用來存儲(chǔ)。這樣訂單查詢還可以和業(yè)務(wù)邏輯的表/庫分開。也可以通過 binlog 進(jìn)行處理,這里的方案只做參考。

結(jié)束語

 

之所以寫這篇文章,也是為了總結(jié)一下最近工作中遇到的問題,以及處理方法。同時(shí)一瞬間想起來了很久前遇到的相同的問題。

 本文轉(zhuǎn)載自微信公眾號(hào)「劉志航」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系劉志航公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 劉志航
相關(guān)推薦

2017-11-03 13:52:46

數(shù)據(jù)分析數(shù)據(jù)處理大數(shù)據(jù)

2017-11-03 07:27:50

數(shù)據(jù)分析數(shù)據(jù)編譯器

2018-11-14 09:53:48

2021-06-08 09:49:01

協(xié)程池Golang設(shè)計(jì)

2018-05-23 00:20:29

2020-06-02 11:30:46

數(shù)據(jù)中臺(tái)計(jì)算機(jī)

2019-06-11 09:50:07

SparkBroadcast代碼

2022-06-30 08:03:13

Prisma數(shù)據(jù)庫工具開源

2015-07-28 14:22:09

BAT

2013-09-22 09:55:23

碼農(nóng)程序員

2021-01-26 05:37:08

分庫分表內(nèi)存

2016-03-08 09:50:42

2021-12-26 18:21:28

MySQLAlter更新表

2019-03-29 09:00:11

Windows 10PC模擬器

2023-09-21 16:17:48

數(shù)據(jù)驅(qū)動(dòng)運(yùn)營(yíng)

2019-10-15 08:40:29

軟件通訊錄相冊(cè)權(quán)限

2016-11-04 08:11:14

聲音

2022-05-06 08:32:40

Pythonwith代碼

2010-10-09 09:20:08

.NET

2021-10-27 20:54:24

分庫分表高并發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)