電商大夥天天都在用,相似某貓,某狗等。
電商系統設計看似複雜又很簡單,看似簡單又很複雜
本章適合初級工程師及中級工程師細看,大佬請隨意
設計以如下爲工具講起程序員
電商的可變性與孩子的心情同樣,變化極快,因此在設計之處就要想好大部分的功能接入及開發,儘可能減小重構次數。對老闆來講節約成本,對程序員來講「珍惜生命」微信
前期業務簡單時,咱們能夠將數據表設計爲下列的樣子框架
TableName | Comments |
---|---|
member | 用戶表 |
member_address | 收貨地址表 |
member_card | 銀行卡表 |
member_cart | 購物車表 |
member_cart_item | 購物車商品表 |
member_collect_product | 商品收藏表 |
member_collect_supplier | 店鋪收藏表 |
member_data | 用戶信息表 |
member_query_history | 用戶搜索歷史表 |
member_wallet | 用戶帳戶表 |
member_withdrawal | 用戶提現表 |
考慮到多種登陸方式,應在數據表中涉及到微信的openid,unionid,支付寶、QQ的用戶token等,這些要在前期就涉及進去,因後期用戶量大了以後加一個字段簡直是噩夢,用戶狀態status也必不可少,比較人也是分好壞,其次就是建立時間,登陸時間等,用戶表與用戶信息表絕逼是綁定關係,這就很少言了。工具
CREATE TABLE `member` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `tel` bigint(20) DEFAULT NULL COMMENT '手機號碼', `password` varchar(555) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '登陸密碼', `wx_token` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '微信TOKEN', `im_token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用戶融雲token', `open_id` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `status` enum('1','-1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '帳號狀態', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `member_tel_unique` (`tel`), UNIQUE KEY `member_wx_token_unique` (`wx_token`) ) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
收貨地址與用戶是一一相對的,在設計上增長鬚要的字段便可,例如 收貨人、收貨人手機號、城市、詳細地址等編碼
CREATE TABLE `member_address` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT '用戶編號', `nick_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收貨人姓名', `tel` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手機號碼', `prov` int(11) DEFAULT NULL COMMENT '省', `city` int(11) NOT NULL COMMENT '市', `area` int(11) DEFAULT NULL COMMENT '區', `address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '街道地址', `number` int(11) NOT NULL COMMENT '郵政編碼', `default` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '默認收貨地址 1=>默認', `deleted_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
用於用戶提現的業務等,大體將銀行卡所需的信息記錄便可,例如持卡人、卡號、歸屬銀行等spa
CREATE TABLE `member_card` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT '用戶編碼', `card_name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '持卡人姓名', `card_number` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '銀行卡號', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `member_card_card_number_unique` (`card_number`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
爲什麼單獨建這個表,也是又必定緣由的,正常只須要member_cart_item表便可,根據實際下線的業務場景,正常購物到超市須要拿一個購物車,但這個購物車並不是屬於你,你使用以後,須要歸還,他人可繼續使用,將購物車公開化,並非將購物車商品公開化。業務場景比較窄,例如京東到家和京東商城同樣(我只是舉例,並不清楚他們怎麼作的),購物車不通用,那如何區分呢,是應該在購物車上區分仍是在購物車商品上區分?我想你已經清楚了。設計
CREATE TABLE `member_cart` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT '用戶編碼', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `member_cart_member_id_unique` (`member_id`), KEY `member_cart_member_id_index` (`member_id`) ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
這塊須要提的一點是 [並非全部表的設計都是互相綁定,互相依賴的],就例如購物車商品表,不單單將商品編碼存儲在內,還要將商品價格,商品的簡介以及商品的規格(既SKU)存儲,不能因賣家下架商品,而查詢不到商品的存在,比較一切以用戶爲主,用戶是上帝的原則,不能讓商品悄悄的就消失了吧。因此在作購物車商品表查詢時,切記不要使用join或者表關聯查詢code
CREATE TABLE `member_cart_item` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `cart_id` int(11) NOT NULL COMMENT '購物車編碼', `product_desc` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品sku信息', `product_img` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品快照', `product_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品名稱', `price` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '價格', `product_id` int(11) NOT NULL COMMENT '商品編碼', `supplier_id` int(11) NOT NULL COMMENT '店鋪編碼', `sku_id` int(11) NOT NULL COMMENT '商品sku編碼', `number` int(11) NOT NULL DEFAULT '1' COMMENT '商品數量', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), KEY `member_cart_item_cart_id_product_id_supplier_id_index` (`cart_id`,`product_id`,`supplier_id`) ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
用戶搜索的記錄是必定要有的,爲了將來的數據分析,智能推薦作準備,畢竟如今是信息共享的時代嘛~blog
CREATE TABLE `member_query_history` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `member_id` int(11) NOT NULL COMMENT '用戶編碼', `keyword` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '關鍵字', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
有不少場景,都要將標題呀,內容呀直接存儲,相似與收藏的店鋪和商品,不管賣家怎麼作,用戶購物車,訂單不能動,這是基準。token
感謝大家看到這裏,下一篇我會講一下關於電商系統的商品設計的部分。有什麼問題能夠評論區提問。謝謝