摘要:訂單號用戶商品標題商品價格商品封面圖商品其他屬性小明愛瘋手機其他屬性像上表中設計,有人會問了那關(guān)聯(lián)的意義何在呢我的回答是保持數(shù)據(jù)關(guān)聯(lián),雖然商戶有可能改變商品屬性,但作為一名程序員,應該盡可能的記錄用戶所有的動作。
電商大伙每天都在用,類似某貓,某狗等。前言
電商系統(tǒng)設計看似復雜又很簡單,看似簡單又很復雜
本章適合初級工程師及中級工程師細看,大佬請隨意
商品系統(tǒng)與訂單系統(tǒng)(交易系統(tǒng))是相鋪相成的,當買家購買商品后將經(jīng)歷一個過程
商品系統(tǒng)->交易系統(tǒng)->訂單系統(tǒng)->物流系統(tǒng)->售后系統(tǒng)
完成上述流程則是完成了一筆交易,經(jīng)常網(wǎng)上購物的童鞋都懂這個。今天我們講下從商品系統(tǒng)到交易系統(tǒng)和訂單系統(tǒng)的存儲過程及其設計上的應該注意的“坑”。
存儲前倆篇文章講解的商品系統(tǒng)的SKU與SPU的設計過程
SPU(Standard Product Unit)標準化產(chǎn)品單元
SKU(Stock Keeping Unit)庫存量單元
現(xiàn)在我們已經(jīng)清楚商品系統(tǒng)數(shù)據(jù)表的設計并且清楚為什么要這樣設計。
現(xiàn)在拋出了一個問題
用戶購買的商品如何存儲到訂單/交易系統(tǒng)中?關(guān)聯(lián)問題
現(xiàn)在有這么一個場景
小明在某寶買了一部愛瘋手機,顏色是紅色,存儲是32G,他選擇使用某寶支付.
SKU | 產(chǎn)品 | 顏色 | 存儲 |
---|---|---|---|
001 | 愛瘋手機 | 紅色 | 32G |
002 | 愛瘋手機 | 紅色 | 256G |
003 | 愛瘋手機 | 黑色 | 32G |
004 | 愛瘋手機 | 黑色 | 256G |
小明選擇購買SKU=001的產(chǎn)品,正常情況下訂單表應該與此SKU編碼相關(guān)聯(lián)來維持數(shù)據(jù)一致性。像這樣
訂單號 | 用戶 | SKU |
---|---|---|
SN110 | 小明 | 001 |
這種設計有個弊端,商品的名稱及價格都不是固定,如果商戶修改了商品的標題或者其他的屬性,那小明當時買的愛瘋手機是8000元,結(jié)果過了幾年降價了商戶修改了價格,結(jié)果小明的購買清單里也變成了修改后的價格,所以說這種僅僅關(guān)聯(lián)的設計是不可取的(至少在電商系統(tǒng)中不可取)。
訂單號 | 用戶 | SKU | 商品標題 | 商品價格 | 商品封面圖 | 商品其他屬性 |
---|---|---|---|---|---|---|
SN110 | 小明 | 001 | 愛瘋手機 | 8000 | aifeng.png | 其他屬性 |
像上表中設計,有人會問了 “那關(guān)聯(lián)的意義何在呢?”
我的回答是 “保持數(shù)據(jù)關(guān)聯(lián)” ,雖然商戶有可能改變商品屬性,但作為一名程序員,應該盡可能的記錄用戶所有的動作。
文末有訂單表的數(shù)據(jù)結(jié)構(gòu)多商戶電商
實際在電商系統(tǒng)設計上,個人感覺不應區(qū)分多商戶的電商與單用戶的電商(至少開發(fā)者不應區(qū)分他們),但前期設計上就應把多商戶概念帶入到系統(tǒng)內(nèi)。哪怕只有一個官方專賣店呢?!
涉及到多商戶就需要考慮用戶統(tǒng)一下單問題了。
訂單是由購物車下單,多個商品來自多個商戶
如果進行拆單、分單
如何進行下單通知等等多商戶的問題
關(guān)于多商戶的問題不是本章的重點,本次我先提出這幾個疑問,感興趣的同學可以提前思考下,后續(xù)文章會詳細講解
訂單是由購物車下單,多個商品來自多個商戶
如果下單是來自多個商戶的商品,那么訂單的數(shù)據(jù)庫接口應該這樣設計
訂單表
訂單號 | 用戶 |
---|---|
SN110 | 小明 |
訂單詳情表
訂單號 | SKU | 用戶 | 商戶 |
---|---|---|---|
SN110 | 001 | 小明 | 官方 |
SN110 | 002 | 小明 | 第三方 |
無論購買多少商品并且商品歸屬于多少個商戶,我們都應把用戶一次性購買的商品歸屬與一個訂單,訂單下再關(guān)聯(lián)多個商品的詳情。在售后操作上,也方便買家退換單個商品。
文末有詳細數(shù)據(jù)結(jié)構(gòu)設計后臺功能列表
這里提供下功能名稱與URL為參考
菜單名稱 | URL |
---|---|
商品管理 | /product |
發(fā)布商品 | /product/create |
商品類目 | /product/category |
品牌管理 | /product/brand |
規(guī)格管理 | /product/attribute |
回收站 | /product/recycle |
訂單列表 | /order |
后臺的設計和操作套路我會多帶帶拿一篇文章來介紹。這里只做一個大概的table。
數(shù)據(jù)表 order 訂單表CREATE TABLE `order` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_no` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "訂單編號", `order_sn` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "交易號", `member_id` int(11) NOT NULL COMMENT "客戶編號", `supplier_id` int(11) DEFAULT "0" COMMENT "商戶編碼", `supplier_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "商戶名稱", `order_status` tinyint(4) NOT NULL DEFAULT "0" COMMENT "訂單狀態(tài) 0未付款,1已付款,2已發(fā)貨,3已簽收,-1退貨申請,-2退貨中,-3已退貨,-4取消交易 -5撤銷申請", `after_status` tinyint(4) NOT NULL DEFAULT "0" COMMENT "用戶售后狀態(tài) 0 未發(fā)起售后 1 申請售后 -1 售后已取消 2 處理中 200 處理完畢", `product_count` int(11) NOT NULL DEFAULT "0" COMMENT "商品數(shù)量", `product_amount_total` decimal(12,4) NOT NULL COMMENT "商品總價", `order_amount_total` decimal(12,4) NOT NULL DEFAULT "0.0000" COMMENT "實際付款金額", `logistics_fee` decimal(12,4) NOT NULL COMMENT "運費金額", `address_id` int(11) NOT NULL COMMENT "收貨地址編碼", `pay_channel` tinyint(4) NOT NULL DEFAULT "0" COMMENT "支付渠道 0余額 1微信 2支付寶", `out_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "訂單支付單號", `escrow_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "第三方支付流水號", `pay_time` int(11) NOT NULL DEFAULT "0" COMMENT "付款時間", `delivery_time` int(11) NOT NULL DEFAULT "0" COMMENT "發(fā)貨時間", `order_settlement_status` tinyint(4) NOT NULL DEFAULT "0" COMMENT "訂單結(jié)算狀態(tài) 0未結(jié)算 1已結(jié)算", `order_settlement_time` int(11) NOT NULL DEFAULT "0" COMMENT "訂單結(jié)算時間", `is_package` enum("0","1") COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "0" COMMENT "是否是套餐", `is_integral` enum("0","1") COLLATE utf8mb4_unicode_ci DEFAULT "0" COMMENT "是否是積分產(chǎn)品", `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), KEY `order_order_sn_member_id_order_status_out_trade_no_index` (`order_sn`,`member_id`,`order_status`,`out_trade_no`(191)) ) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;order_detail 訂單詳情
CREATE TABLE `order_detail` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL COMMENT "訂單編碼", `product_id` int(11) NOT NULL COMMENT "商品編碼", `product_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "商品名稱", `product_price` decimal(12,4) NOT NULL COMMENT "商品價格", `product_sku` int(11) NOT NULL COMMENT "商品SKU", `product_picture_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `product_mode_desc` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "商品型號信息", `product_mode_params` int(11) DEFAULT NULL COMMENT "商品型號參數(shù)", `discount_rate` tinyint(4) NOT NULL DEFAULT "0" COMMENT "折扣比例", `discount_amount` decimal(12,4) NOT NULL DEFAULT "0.0000" COMMENT "折扣比例", `number` int(11) NOT NULL DEFAULT "1" COMMENT "購買數(shù)量", `subtotal` decimal(12,4) NOT NULL COMMENT "小計金額", `is_product_exists` enum("0","1") COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "0" COMMENT "商品是否有效 1失效", `remark` text COLLATE utf8mb4_unicode_ci COMMENT "客戶商品備注", `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), KEY `order_detail_order_id_index` (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;order_logistics 訂單物流
CREATE TABLE `order_logistics` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL COMMENT "訂單編碼", `express_no` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "發(fā)貨快遞單號", `consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "收貨人姓名", `consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "聯(lián)系電話", `consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "備用聯(lián)系電話", `consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "收貨地址", `consignee_zip` int(11) NOT NULL COMMENT "郵政編碼", `logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "物流方式", `logistics_fee` decimal(12,2) NOT NULL DEFAULT "0.00" COMMENT "物流發(fā)貨運費", `order_logistics_status` int(11) NOT NULL DEFAULT "0" COMMENT "物流狀態(tài)", `logistics_settlement_status` int(11) NOT NULL DEFAULT "0" COMMENT "物流結(jié)算狀態(tài)", `logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "物流最后狀態(tài)描述", `logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "物流描述", `logistics_create_time` int(11) NOT NULL DEFAULT "0" COMMENT "發(fā)貨時間", `logistics_update_time` int(11) NOT NULL DEFAULT "0" COMMENT "物流更新時間", `logistics_settlement_time` int(11) NOT NULL DEFAULT "0" COMMENT "物流結(jié)算時間", PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;order_returns 訂單退換貨
CREATE TABLE `order_returns` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `returns_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "退貨編號 供客戶查詢", `order_id` int(11) NOT NULL COMMENT "訂單編號", `express_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "物流單號", `consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "收貨人姓名", `consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "聯(lián)系電話", `consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "備用聯(lián)系電話", `consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "收貨地址", `consignee_zip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "郵政編碼", `logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "物流方式", `logistics_fee` decimal(12,2) NOT NULL COMMENT "物流發(fā)貨運費", `order_logistics_status` int(11) DEFAULT NULL COMMENT "物流狀態(tài)", `logistics_settlement_status` int(11) DEFAULT NULL COMMENT "物流結(jié)算狀態(tài)", `logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "物流最后狀態(tài)描述", `logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "物流描述", `logistics_create_time` int(11) DEFAULT NULL COMMENT "發(fā)貨時間", `logistics_update_time` int(11) DEFAULT NULL COMMENT "物流更新時間", `logistics_settlement_time` int(11) DEFAULT NULL COMMENT "物流結(jié)算時間", `returns_type` tinyint(4) NOT NULL DEFAULT "0" COMMENT "0全部退單 1部分退單", `handling_way` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "PUPAWAY:退貨入庫;REDELIVERY:重新發(fā)貨;RECLAIM-REDELIVERY:不要求歸還并重新發(fā)貨; REFUND:退款; COMPENSATION:不退貨并賠償", `returns_amount` decimal(8,2) NOT NULL COMMENT "退款金額", `return_submit_time` int(11) NOT NULL COMMENT "退貨申請時間", `handling_time` int(11) NOT NULL COMMENT "退貨處理時間", `remark` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "退貨原因", PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;order_returns_apply 售后申請
退換貨申請
CREATE TABLE `order_returns_apply` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "訂單單號", `order_detail_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "子訂單編碼", `return_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "售后單號", `member_id` int(11) NOT NULL COMMENT "用戶編碼", `state` tinyint(4) NOT NULL COMMENT "類型 0 僅退款 1退貨退款", `product_status` tinyint(4) NOT NULL DEFAULT "0" COMMENT "貨物狀態(tài) 0:已收到貨 1:未收到貨", `why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "退換貨原因", `status` tinyint(4) NOT NULL DEFAULT "0" COMMENT "審核狀態(tài) -1 拒絕 0 未審核 1審核通過", `audit_time` int(11) NOT NULL DEFAULT "0" COMMENT "審核時間", `audit_why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "審核原因", `note` text COLLATE utf8mb4_unicode_ci COMMENT "備注", `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;致謝
感謝你看完這篇文章,接下來會繼續(xù)出一些電商相關(guān)的文章,例如交易系統(tǒng)的設計、訂單系統(tǒng)的設計等等。感謝近期來關(guān)注我的童鞋們。作為一個程序員,我很榮幸能把我知道的分享給大家。
代碼多變,初心不變
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29051.html
摘要:前言這是電商系統(tǒng)設計系列在商品設計這塊的最后一篇文章。電商系統(tǒng)商品相關(guān)的文章已經(jīng)到了尾聲如果有其他商品相關(guān)的文章需要編寫可以私信聯(lián)系我畢竟我也是公司員工寫這些文章并不是我的工作,只是記錄我的職業(yè)生涯。 showImg(https://segmentfault.com/img/bVbePdh?w=1260&h=628); 前言 這是電商系統(tǒng)設計系列在商品設計這塊的最后一篇文章。以下是其他...
摘要:可擴展性百度百科的定義是設計良好的代碼允許更多的功能在必要時可以被插入到適當?shù)奈恢弥小UY徫镘嚿唐穬?yōu)惠券都是獨立的系統(tǒng)及功能,不要看做商品在購物車內(nèi)。可維護性百度百科的定義是系統(tǒng)的可維護性是衡量一個系統(tǒng)的可修復恢復性和可改進性的難易程度。 showImg(https://segmentfault.com/img/bVbcqJE?w=506&h=326); 本章適合初級工程師及中級工程...
摘要:我一直在說電商是一個既簡單又復雜的東西本章我們再一次深度解析電商系統(tǒng)商品設計的更多邏輯與實現(xiàn)。品牌無需關(guān)聯(lián)到內(nèi),道理很簡單,當前的是歸屬與蘋果公司,自然而然下面的規(guī)格都屬于蘋果了。 showImg(https://segmentfault.com/img/bVbdtuc?w=1824&h=1028); 電商大伙每天都在用,類似某貓,某狗等。電商系統(tǒng)設計看似復雜又很簡單,看似簡單又很復雜...
摘要:如果設計不合理例如商品添加很簡單,但是修改商品就很復雜。在前期設計上我們要盡量避免這些坑謝謝你看到這里,希望我的文章能夠幫助到你。 showImg(https://segmentfault.com/img/bVbdtuc?w=1824&h=1028); 電商大伙每天都在用,類似某貓,某狗等。電商系統(tǒng)設計看似復雜又很簡單,看似簡單又很復雜本章適合初級工程師及中級工程師細看,大佬請隨意 前...
摘要:本篇我思考了很久到底要不要解析下商品接口開發(fā)的注意點。接口設計簡述電商系統(tǒng)設計之中,比較復雜的接口就論商品詳情的接口了,響應參數(shù)特別多,特別雜。 showImg(https://segmentfault.com/img/bVbeJkL?w=1162&h=712); 前言 我應該是少數(shù)在文章中直接展示接口文檔的人。本篇我思考了很久到底要不要解析下商品接口開發(fā)的注意點。 客戶端開發(fā)與服務端...
閱讀 1567·2021-11-24 09:39
閱讀 1053·2021-11-22 15:11
閱讀 2174·2021-11-19 11:35
閱讀 1630·2021-09-13 10:37
閱讀 2460·2021-09-03 10:47
閱讀 2146·2021-08-30 09:47
閱讀 1635·2021-08-20 09:39
閱讀 2907·2019-08-30 14:13