你上線(xiàn)了一套商城系統(tǒng),三個(gè)月后業(yè)務(wù)要引入第三方供應(yīng)商,技術(shù)團(tuán)隊(duì)告訴你“當(dāng)前架構(gòu)做不到,需要重構(gòu)”。這不是假設(shè),而是大量企業(yè)在未甄別單商戶(hù)與多商戶(hù)商城差異時(shí)就投入開(kāi)發(fā)后遭遇的真實(shí)困境。兩者的區(qū)別絕不僅是“能不能開(kāi)多家店”這么簡(jiǎn)單,它直接決定了你的數(shù)據(jù)隔離策略、資金結(jié)算模型、權(quán)限體系以及未來(lái)三年的擴(kuò)展天花板。
架構(gòu)核心分歧:賬戶(hù)體系與數(shù)據(jù)歸屬
單商戶(hù)商城(Single-Vendor Marketplace)的本質(zhì)是一個(gè)賣(mài)家面對(duì)多個(gè)買(mǎi)家。系統(tǒng)內(nèi)只有一個(gè)唯一的商戶(hù)主體,所有商品、訂單、營(yíng)銷(xiāo)活動(dòng)都由平臺(tái)運(yùn)營(yíng)方統(tǒng)一管理。你的后臺(tái)就是唯一的管理面板,所有交易收入歸屬平臺(tái),不存在分賬邏輯。
多商戶(hù)商城(Multi-Vendor Marketplace)則是平臺(tái)引入多個(gè)獨(dú)立商戶(hù),每個(gè)商戶(hù)擁有自己的商品管理、訂單處理流程和結(jié)算賬戶(hù)。系統(tǒng)存在“平臺(tái)管理員”與“商戶(hù)”兩類(lèi)角色,且二者的權(quán)限邊界必須嚴(yán)格區(qū)隔。商戶(hù) A 不能查看商戶(hù) B 的訂單數(shù)據(jù),商戶(hù)只能操作自己店鋪下的商品、價(jià)格、庫(kù)存、售后單。這要求系統(tǒng)在內(nèi)核層實(shí)現(xiàn)數(shù)據(jù)行級(jí)隔離,而不是僅在界面層隱藏菜單。
如果你正在評(píng)估某個(gè)開(kāi)源或商業(yè)商城產(chǎn)品,最直接的判別方法是檢查它的用戶(hù)表設(shè)計(jì):是否存在獨(dú)立的商戶(hù) ID 字段,并且該字段作為訂單表、商品表、退款表的強(qiáng)制過(guò)濾條件。單商戶(hù)系統(tǒng)通常只有 user 表和 admin 角色,而多商戶(hù)系統(tǒng)必然存在 merchant 實(shí)體,且 product.merchant_id、order.merchant_id 這類(lèi)歸屬關(guān)系貫穿整個(gè)數(shù)據(jù)模型。
如何根據(jù)業(yè)務(wù)模式匹配架構(gòu)
用錯(cuò)架構(gòu)的典型場(chǎng)景有兩類(lèi):
- 未來(lái)需要招商入駐卻選了單商戶(hù)系統(tǒng)。此時(shí)你無(wú)法為外部商戶(hù)提供獨(dú)立后臺(tái),所有商品上架必須經(jīng)由平臺(tái)運(yùn)營(yíng)手動(dòng)操作,商戶(hù)查賬對(duì)賬只能線(xiàn)下完成。硬性改造通常要?jiǎng)訑?shù)據(jù)庫(kù)核心關(guān)聯(lián),成本不低于重建。
- 自營(yíng)業(yè)務(wù)為主卻選用了多商戶(hù)平臺(tái)。多商戶(hù)系統(tǒng)引入的商戶(hù)入駐審核、資質(zhì)管理、分賬結(jié)算、傭金抽成等模塊會(huì)成為無(wú)用的復(fù)雜度,拖累后臺(tái)操作效率,并增加中臺(tái)維護(hù)成本。
判斷路徑可以這樣走:
- 你的商品是由單一主體(自家采購(gòu)、自家倉(cāng)庫(kù)、自家定價(jià))統(tǒng)一供給,還是由多個(gè)具有獨(dú)立定價(jià)權(quán)、庫(kù)存管理權(quán)的商家共同供給?
- 資金是統(tǒng)一歸入企業(yè)賬戶(hù)后續(xù)自行處理,還是必須系統(tǒng)內(nèi)自動(dòng)完成平臺(tái)抽傭、商戶(hù)分賬、提現(xiàn)審批?
- 是否需要為每個(gè)商家提供獨(dú)立的經(jīng)營(yíng)數(shù)據(jù)看板、訂單處理后臺(tái)和客服工具?
如果以上所有問(wèn)題都指向單一主體,單商戶(hù)架構(gòu)足夠。如果其中任何一個(gè)指向“需要獨(dú)立商戶(hù)管理”,你就必須考慮原生支持多商戶(hù)架構(gòu)的系統(tǒng),或選用可擴(kuò)展的單商戶(hù)系統(tǒng)但接受后期改造成本。
實(shí)現(xiàn)時(shí)不可忽略的三個(gè)邊界條件
即使選定多商戶(hù)架構(gòu),實(shí)施中仍有大量細(xì)節(jié)會(huì)直接影響系統(tǒng)上線(xiàn)后的穩(wěn)定性:
商戶(hù)結(jié)算不能只靠“記錄余額”。你必須在架構(gòu)層面把商戶(hù)資金流水設(shè)計(jì)為不可變?nèi)罩?。一個(gè)最小可驗(yàn)證的訂單結(jié)算流水分片結(jié)構(gòu)可以這樣考慮:
{
"transaction_id": "txn_20250601_001",
"order_id": "ORD-98765",
"merchant_id": "M-342",
"amount": 173.00,
"type": "settlement",
"status": "pending",
"created_at": "2025-06-01T10:22:00Z"
}
每一筆與商戶(hù)資金相關(guān)的記錄(訂單支付、退款、平臺(tái)傭金扣除、提現(xiàn)申請(qǐng))都寫(xiě)入類(lèi)似日志表,任何對(duì)余額的修改必須由這些日志重算得出,嚴(yán)禁直接更新余額字段而繞過(guò)流水記錄。這樣做才能在出現(xiàn)賬務(wù)分歧時(shí)完整回溯。
權(quán)限模型必須防御商戶(hù)越權(quán)。后端接口不能單純依賴(lài)前端隱藏按鈕來(lái)控制權(quán)限。例如:
// 獲取訂單詳情時(shí),必須在數(shù)據(jù)訪(fǎng)問(wèn)層強(qiáng)制過(guò)濾商戶(hù)ID
function getOrderDetail(orderId, currentMerchantId) {
return Order.findOne({
where: {
id: orderId,
merchant_id: currentMerchantId // 關(guān)鍵限制條件
}
});
}
任何遺漏 merchant_id 過(guò)濾的查詢(xún)都會(huì)導(dǎo)致商戶(hù) A 訪(fǎng)問(wèn)到商戶(hù) B 的訂單,這是多商戶(hù)商城的致命缺陷,且往往在安全審計(jì)時(shí)才被發(fā)現(xiàn)。
平臺(tái)抽傭邏輯必須可配置且禁止硬編碼。傭金規(guī)則不應(yīng)寫(xiě)死在結(jié)算代碼里。應(yīng)當(dāng)為每個(gè)商戶(hù)或商品類(lèi)目維護(hù)獨(dú)立的傭金率配置,例如 merchant_commission 表支持按商戶(hù)、按品類(lèi)、按時(shí)間段設(shè)置不同比例,結(jié)算時(shí)動(dòng)態(tài)讀取并生成傭金扣減記錄。
行動(dòng)建議
不要在產(chǎn)品原型階段因?yàn)椤岸嗌虘?hù)看起來(lái)復(fù)雜”而選擇單商戶(hù)系統(tǒng),然后期望招商階段再升級(jí)。如果你有12個(gè)月內(nèi)引入第三方商家的規(guī)劃,現(xiàn)在就按多商戶(hù)架構(gòu)選型。對(duì)于已經(jīng)處于單商戶(hù)生產(chǎn)環(huán)境且有招商需求的項(xiàng)目,評(píng)估遷移成本時(shí)重點(diǎn)看三塊:用戶(hù)體系的商戶(hù)身份改造、訂單/商品數(shù)據(jù)的商戶(hù)歸屬回填、資金系統(tǒng)的分賬能力重建。如果這三塊任何一塊評(píng)估工期超過(guò)6周,優(yōu)先考慮另起新系統(tǒng)、通過(guò)接口逐步遷移業(yè)務(wù)。
最終,選擇哪種架構(gòu)不取決于技術(shù)團(tuán)隊(duì)對(duì)某一方案的熟悉程度,而是由你的商業(yè)合約關(guān)系決定——你是只服務(wù)自己的消費(fèi)者,還是同時(shí)服務(wù)賣(mài)家和買(mǎi)家。