常見電商項目的數據庫表設計(MySQL版)

簡介:

目的:

  • 電商常用功能模塊的數據庫設計
  • 常見問題的數據庫解決方案

環境:

  • MySQL5.7
  • 圖形客戶端,SQLyog
  • Linux

模塊:

  • 用戶:註冊、登陸
  • 商品:瀏覽、管理
  • 訂單:生成、管理
  • 倉配:庫存、管理

電商實例數據庫結構設計

電商項目用戶模塊

  • 用戶表涉及的實體


    用戶實體
  • 改進1:第三範式:將依賴傳遞的列分離出來

    • 比如:登錄名<-用戶級別<-級別積分上限,級別積分下限


      第三範式依賴分離
  • 改進2:儘量做到冷熱數據的分離,減小表的寬度


    冷熱數據
  • 用戶登錄表(customer_login)

CREATE TABLE customer_login(
  customer_id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '用戶ID',
  login_name VARCHAR(20) NOT NULL COMMENT '用戶登錄名',
  password CHAR(32) NOT NULL COMMENT 'md5加密的密碼',
  user_stats TINYINT NOT NULL DEFAULT 1 COMMENT '用戶狀態',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_customerid(customer_id)
) ENGINE = innodb COMMENT '用戶登錄表'
  • 用戶信息表(customer_inf)
CREATE TABLE customer_inf(
  customer_inf_id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '自增主鍵ID',
  customer_id INT UNSIGNED NOT NULL COMMENT 'customer_login表的自增ID',
  customer_name VARCHAR(20) NOT NULL COMMENT '用戶真實姓名',
  identity_card_type TINYINT NOT NULL DEFAULT 1 COMMENT '證件類型:1 身份證,2 軍官證,3 護照',
  identity_card_no VARCHAR(20) COMMENT '證件號碼',
  mobile_phone INT UNSIGNED COMMENT '手機號',
  customer_email VARCHAR(50) COMMENT '郵箱',
  gender CHAR(1) COMMENT '性別',
  user_point INT NOT NULL DEFAULT 0 COMMENT '用戶積分',
  register_time TIMESTAMP NOT NULL COMMENT '註冊時間',
  birthday DATETIME COMMENT '會員生日',
  customer_level TINYINT NOT NULL DEFAULT 1 COMMENT '會員級別:1 普通會員,2 青銅,3白銀,4黃金,5鑽石',
  user_money DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '用戶餘額',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_customerinfid(customer_inf_id)
) ENGINE = innodb COMMENT '用戶信息表';
  • 用戶級別表(customer_level_inf)
CREATE TABLE customer_level_inf(
  customer_level TINYINT NOT NULL AUTO_INCREMENT COMMENT '會員級別ID',
  level_name VARCHAR(10) NOT NULL COMMENT '會員級別名稱',
  min_point INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '該級別最低積分',
  max_point INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '該級別最高積分',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_levelid(customer_level)
) ENGINE = innodb COMMENT '用戶級別信息表';
  • 用戶地址表(customer_addr)
CREATE TABLE customer_addr(
  customer_addr_id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '自增主鍵ID',
  customer_id INT UNSIGNED NOT NULL COMMENT 'customer_login表的自增ID',
  zip SMALLINT NOT NULL COMMENT '郵編',
  province SMALLINT NOT NULL COMMENT '地區表中省份的ID',
  city SMALLINT NOT NULL COMMENT '地區表中城市的ID',
  district SMALLINT NOT NULL COMMENT '地區表中的區ID',
  address VARCHAR(200) NOT NULL COMMENT '具體的地址門牌號',
  is_default TINYINT NOT NULL COMMENT '是否默認',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_customeraddid(customer_addr_id)
) ENGINE = innodb COMMENT '用戶地址表';
  • 用戶積分日誌表(customer_point_log)
CREATE TABLE customer_point_log(
  point_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '積分日誌ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '用戶ID',
  source TINYINT UNSIGNED NOT NULL COMMENT '積分來源:0訂單,1登陸,2活動',
  refer_number INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '積分來源相關編號',
  change_point SMALLINT NOT NULL DEFAULT 0 COMMENT '變更積分數',
  create_time TIMESTAMP NOT NULL COMMENT '積分日誌生成時間',
  PRIMARY KEY pk_pointid(point_id)
) ENGINE = innodb COMMENT '用戶積分日誌表';
  • 用戶餘額變動表(customer_balance_log)
CREATE TABLE customer_balance_log(
  balance_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '餘額日誌ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '用戶ID',
  source TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '記錄來源:1訂單,2退貨單',
  source_sn INT UNSIGNED NOT NULL COMMENT '相關單據ID',
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記錄生成時間',
  amount DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '變動金額',
  PRIMARY KEY pk_balanceid(balance_id)
) ENGINE = innodb COMMENT '用戶餘額變動表';
  • 用戶登陸日誌表(customer_login_log)
CREATE TABLE customer_login_log(
  login_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '登陸日誌ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '登陸用戶ID',
  login_time TIMESTAMP NOT NULL COMMENT '用戶登陸時間',
  login_ip INT UNSIGNED NOT NULL COMMENT '登陸IP',
  login_type TINYINT NOT NULL COMMENT '登陸類型:0未成功,1成功',
  PRIMARY KEY pk_loginid(login_id)
) ENGINE = innodb COMMENT '用戶登陸日誌表';

Hash分區表

分區表特點:邏輯上爲一個表,在物理上存儲在多個文件中

CREATE TABLE customer_login_log(
  login_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '登陸日誌ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '登陸用戶ID',
  login_time TIMESTAMP NOT NULL COMMENT '用戶登陸時間',
  login_ip INT UNSIGNED NOT NULL COMMENT '登陸IP',
  login_type TINYINT NOT NULL COMMENT '登陸類型:0未成功,1成功',
  PRIMARY KEY pk_loginid(login_id)
) ENGINE = innodb COMMENT '用戶登陸日誌表'
PARTITION BY HASH(customer_id) PARTITIONS 4;

區別就在於加了PARTITION這個命令。
文件結構上的區別

  • 普通表結構:
    • customer_login_log.frm
    • customer_login_log.ibd
  • 分區表結構:
    • customer_login_log.frm
    • customer_login_log#P#p0.ibd
    • customer_login_log#P#p1.ibd
    • customer_login_log#P#p2.ibd
    • customer_login_log#P#p3.ibd

按HASH分區的特點

  • 根據MOD(分區建,分區數)的值把數據行存儲到表的不同分區
  • 數據可以平均的分佈在各個分區中
  • HASH分區的鍵值必須是一個INT類型的值,或是通過函數可以轉爲INT類型比如UNIX_TIMESTAMP(login_time)

Range分區表

特點:

  • 根據分區鍵值的範圍把數據行存儲到表的不同分區中
  • 多個分區的範圍要連續,但是不能重複
  • 默認情況下使用VALUES LESS THAN屬性,即每個分區不包括指定的那個值
CREATE TABLE customer_login_log(
  login_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '登陸日誌ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '登陸用戶ID',
  login_time TIMESTAMP NOT NULL COMMENT '用戶登陸時間',
  login_ip INT UNSIGNED NOT NULL COMMENT '登陸IP',
  login_type TINYINT NOT NULL COMMENT '登陸類型:0未成功,1成功',
  PRIMARY KEY pk_loginid(login_id)
) ENGINE = innodb COMMENT '用戶登陸日誌表'
PARTITION BY RANGE (customer_id) (
    PARTITION p0 VALUES LESS THAN (10000),
    PARTITION p1 VALUES LESS THAN (10000),
    PARTITION p2 VALUES LESS THAN (10000),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

Range分區的適用範圍

  • 分區鍵爲日期或是時間類型
  • 所有SELECT查詢中都包括分區鍵

LIST分區

特點:

  • 按分區鍵取值的列表進行分區
  • 同範圍分區一樣,各分區的列表值不能重複
  • 每一行數據必須能找到對應的分區列表,否則數據插入失敗
CREATE TABLE customer_login_log(
  login_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '登陸日誌ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '登陸用戶ID',
  login_time TIMESTAMP NOT NULL COMMENT '用戶登陸時間',
  login_ip INT UNSIGNED NOT NULL COMMENT '登陸IP',
  login_type TINYINT NOT NULL COMMENT '登陸類型:0未成功,1成功',
  PRIMARY KEY pk_loginid(login_id)
) ENGINE = innodb COMMENT '用戶登陸日誌表'
PARTITION BY LIST (login_type) (
    PARTITION p0 VALUES (1,3,5,7,9),
    PARTITION p1 VALUES (2,4,6,8)
);

如何選擇正確的分區類型

如何爲customer_login_log表分區

業務場景:

  • 用戶每次登錄都會記錄
  • 日誌保存一年,一年後可刪除

解決:

  • 使用RANGE範圍分區
  • 以login_type作爲分區鍵

如何查看分區是否正確:

  • 使用SELECT查詢information_schema.PARTITIONS
  • 這裏不使用MAXVALUE,防止後續的日期全部歸到一個分區中,而是使用定時計劃修改增加分區ALTER TABLE customer_login_log ADD PARTITION (PARTITION p4 VALUES LESS THAN(2018))
  • 刪除以前一年的分區ALTER TABLE customer_login_log DROP PARTITION p0;
  • 過期數據歸檔
    • 分區數據歸檔遷移條件
      1. mysql >= 5.7
      2. 結構相同
      3. 歸檔到的數據表一定是非分區表
      4. 非臨時表;不能有外鍵約束
      5. 歸檔引擎要是:archive
    • 操作步驟
      • 建立用戶登陸日誌歸檔
      CREATE TABLE arch_customer_login_log(
        login_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '登陸日誌ID',
        customer_id INT UNSIGNED NOT NULL COMMENT '登陸用戶ID',
        login_time TIMESTAMP NOT NULL COMMENT '用戶登陸時間',
        login_ip INT UNSIGNED NOT NULL COMMENT '登陸IP',
        login_type TINYINT NOT NULL COMMENT '登陸類型:0未成功,1成功',
        PRIMARY KEY pk_loginid(login_id)
      ) ENGINE = innodb COMMENT '用戶登陸日誌歸檔表'
      
      • 歸檔操作:ALTER TABLE customer_login_log EXCHANGE PARTITION p1 WITH TABLE arch_customer_login_log
      • 遷移後刪除:ALTER TABLE customer_login_log DROP PARTITION p2
      • 根據需要可以把歸檔的表引擎改爲ARCHIVE

使用分區表的注意事項

  • 結合業務場景選擇分區鍵,避免跨分區查詢
  • 對分區表進行查詢最好在WHERE從句中包含分區鍵
  • 具有主鍵或唯一索引的表,主鍵或唯一索引必須是分區鍵的一部分

商品實體

image
  • 品牌信息表(brand_info)
CREATE TABLE brand_info(
  brand_id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '品牌ID',
  brand_name VARCHAR(50) NOT NULL COMMENT '品牌名稱',
  telephone VARCHAR(50) NOT NULL COMMENT '聯繫電話',
  brand_web VARCHAR(100) COMMENT '品牌網絡',
  brand_logo VARCHAR(100) COMMENT '品牌logo URL',
  brand_desc VARCHAR(150) COMMENT '品牌描述',
  brand_status TINYINT NOT NULL DEFAULT 0 COMMENT '品牌狀態,0禁用,1啓用',
  brand_order TINYINT NOT NULL DEFAULT 0 COMMENT '排序',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_brandid (brand_id)
)ENGINE=innodb COMMENT '品牌信息表';
  • 分類信息表(product_category)
CREATE TABLE product_category(
  category_id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '分類ID',
  category_name VARCHAR(10) NOT NULL COMMENT '分類名稱',
  category_code VARCHAR(10) NOT NULL COMMENT '分類編碼',
  parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父分類ID',
  category_level TINYINT NOT NULL DEFAULT 1 COMMENT '分類層級',
  category_status TINYINT NOT NULL DEFAULT 1 COMMENT '分類狀態',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT  '最後修改時間',
  PRIMARY KEY pk_categoryid(category_id)
)ENGINE=innodb COMMENT '商品分類表'
  • 供應商信息表(supplier_info)
CREATE TABLE supplier_info(
  supplier_id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '供應商ID',
  supplier_code CHAR(8) NOT NULL COMMENT '供應商編碼',
  supplier_name CHAR(50) NOT NULL COMMENT '供應商名稱',
  supplier_type TINYINT NOT NULL COMMENT '供應商類型:1.自營,2.平臺',
  link_man VARCHAR(10) NOT NULL COMMENT '供應商聯繫人',
  phone_number VARCHAR(50) NOT NULL COMMENT '聯繫電話',
  bank_name VARCHAR(50) NOT NULL COMMENT '供應商開戶銀行名稱',
  bank_account VARCHAR(50) NOT NULL COMMENT '銀行賬號',
  address VARCHAR(200) NOT NULL COMMENT '供應商地址',
  supplier_status TINYINT NOT NULL DEFAULT 0 COMMENT '狀態:0禁止,1啓用',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT  '最後修改時間',
  PRIMARY KEY pk_supplierid(supplier_id)
) ENGINE = innodb COMMENT '供應商信息表';
  • 商品信息表(product_info)
    • 寬度較寬,字段差不多一起使用
    • 可以被緩存
CREATE TABLE product_info(
  product_id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '商品ID',
  product_core CHAR(16) NOT NULL COMMENT '商品編碼',
  product_name VARCHAR(20) NOT NULL COMMENT '商品名稱',
  bar_code VARCHAR(50) NOT NULL COMMENT '國條碼',
  brand_id INT UNSIGNED NOT NULL COMMENT '品牌表的ID',
  one_category_id SMALLINT UNSIGNED NOT NULL COMMENT '一級分類ID',
  two_category_id SMALLINT UNSIGNED NOT NULL COMMENT '二級分類ID',
  three_category_id SMALLINT UNSIGNED NOT NULL COMMENT '三級分類ID',
  supplier_id INT UNSIGNED NOT NULL COMMENT '商品的供應商ID',
  price DECIMAL(8,2) NOT NULL COMMENT '商品銷售價格',
  average_cost DECIMAL(18,2) NOT NULL COMMENT '商品加權平均成本',
  publish_status TINYINT NOT NULL DEFAULT 0 COMMENT '上下架狀態:0下架1上架',
  audit_status TINYINT NOT NULL DEFAULT 0 COMMENT '審覈狀態:0未審覈,1已審覈',
  weight FLOAT COMMENT '商品重量',
  length FLOAT COMMENT '商品長度',
  height FLOAT COMMENT '商品高度',
  width FLOAT COMMENT '商品寬度',
  color_type ENUM('紅','黃','藍','黑'),
  production_date DATETIME NOT NULL COMMENT '生產日期',
  shelf_life INT NOT NULL COMMENT '商品有效期',
  descript TEXT NOT NULL COMMENT '商品描述',
  indate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '商品錄入時間',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_productid(product_id)
) ENGINE = innodb COMMENT '商品信息表';
  • 商品圖片表(product_pic_info)
CREATE TABLE product_pic_info(
  product_pic_id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '商品圖片ID',
  product_id INT UNSIGNED NOT NULL COMMENT '商品ID',
  pic_desc VARCHAR(50) COMMENT '圖片描述',
  pic_url VARCHAR(200) NOT NULL COMMENT '圖片URL',
  is_master TINYINT NOT NULL DEFAULT 0 COMMENT '是否主圖:0.非主圖1.主圖',
  pic_order TINYINT NOT NULL DEFAULT 0 COMMENT '圖片排序',
  pic_status TINYINT NOT NULL DEFAULT 1 COMMENT '圖片是否有效:0無效 1有效',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT  '最後修改時間',
  PRIMARY KEY pk_picid(product_pic_id)
)ENGINE=innodb COMMENT '商品圖片信息表';
  • 商品評論表(product_comment)
CREATE TABLE product_comment(
  comment_id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '評論ID',
  product_id INT UNSIGNED NOT NULL COMMENT '商品ID',
  order_id BIGINT UNSIGNED NOT NULL COMMENT '訂單ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '用戶ID',
  title VARCHAR(50) NOT NULL COMMENT '評論標題',
  content VARCHAR(300) NOT NULL COMMENT '評論內容',
  audit_status TINYINT NOT NULL COMMENT '審覈狀態:0未審覈,1已審覈',
  audit_time TIMESTAMP NOT NULL COMMENT '評論時間',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_commentid(comment_id)
) ENGINE = innodb COMMENT '商品評論表';

訂單模塊

image
  • 訂單主表(order_master)
CREATE TABLE order_master(
  order_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '訂單ID',
  order_sn BIGINT UNSIGNED NOT NULL COMMENT '訂單編號 yyyymmddnnnnnnnn',
  customer_id INT UNSIGNED NOT NULL COMMENT '下單人ID',
  shipping_user VARCHAR(10) NOT NULL COMMENT '收貨人姓名',
  province SMALLINT NOT NULL COMMENT '省',
  city SMALLINT NOT NULL COMMENT '市',
  district SMALLINT NOT NULL COMMENT '區',
  address VARCHAR(100) NOT NULL COMMENT '地址',
  payment_method TINYINT NOT NULL COMMENT '支付方式:1現金,2餘額,3網銀,4支付寶,5微信',
  order_money DECIMAL(8,2) NOT NULL COMMENT '訂單金額',
  district_money DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '優惠金額',
  shipping_money DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '運費金額',
  payment_money DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '支付金額',
  shipping_comp_name VARCHAR(10) COMMENT '快遞公司名稱',
  shipping_sn VARCHAR(50) COMMENT '快遞單號',
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下單時間',
  shipping_time DATETIME COMMENT '發貨時間',
  pay_time DATETIME COMMENT '支付時間',
  receive_time DATETIME COMMENT '收貨時間',
  order_status TINYINT NOT NULL DEFAULT 0 COMMENT '訂單狀態',
  order_point INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '訂單積分',
  invoice_time VARCHAR(100) COMMENT '發票擡頭',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_orderid(order_id)
)ENGINE = innodb COMMENT '訂單主表';
  • 訂單詳情表(order_detail)
CREATE TABLE order_detail(
  order_detail_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '訂單詳情表ID',
  order_id INT UNSIGNED NOT NULL COMMENT '訂單表ID',
  product_id INT UNSIGNED NOT NULL COMMENT '訂單商品ID',
  product_name VARCHAR(50) NOT NULL COMMENT '商品名稱',
  product_cnt INT NOT NULL DEFAULT 1 COMMENT '購買商品數量',
  product_price DECIMAL(8,2) NOT NULL COMMENT '購買商品單價',
  average_cost DECIMAL(8,2) NOT NULL COMMENT '平均成本價格',
  weight FLOAT COMMENT '商品重量',
  fee_money DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '優惠分攤金額',
  w_id INT UNSIGNED NOT NULL COMMENT '倉庫ID',
    modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_orderdetailid(order_detail_id)
)ENGINE = innodb COMMENT '訂單詳情表'
  • 購物車表(order_cart)
CREATE TABLE order_cart(
  cart_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '購物車ID',
  customer_id INT UNSIGNED NOT NULL COMMENT '用戶ID',
  product_id INT UNSIGNED NOT NULL COMMENT '商品ID',
  product_amount INT NOT NULL COMMENT '加入購物車商品數量',
  price DECIMAL(8,2) NOT NULL COMMENT '商品價格',
  add_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入購物車時間',
      modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_cartid(cart_id)
) ENGINE = innodb COMMENT '購物車表';
  • 倉庫信息表(warehouse_info)
CREATE TABLE warehouse_info(
  w_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '倉庫ID',
  warehouse_sn CHAR(5) NOT NULL COMMENT '倉庫編碼',
  warehoust_name VARCHAR(10) NOT NULL COMMENT '倉庫名稱',
  warehouse_phone VARCHAR(20) NOT NULL COMMENT '倉庫電話',
  contact VARCHAR(10) NOT NULL COMMENT '倉庫聯繫人',
  province SMALLINT NOT NULL COMMENT '省',
  city SMALLINT NOT NULL COMMENT '市',
  distrct SMALLINT NOT NULL COMMENT '區',
  address VARCHAR(100) NOT NULL COMMENT '倉庫地址',
  warehouse_status TINYINT NOT NULL DEFAULT 1 COMMENT '倉庫狀態:0禁用,1啓用',
        modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_wid(w_id)
)ENGINE = innodb COMMENT '倉庫信息表';
  • 商品庫存表(warehouse_product)
CREATE TABLE warehouse_product(
  wp_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品庫存ID',
  product_id INT UNSIGNED NOT NULL COMMENT '商品ID',
  w_id SMALLINT UNSIGNED NOT NULL COMMENT '倉庫ID',
  current_cnt INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '當前商品數量',
  lock_cnt INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '當前佔用數據',
  in_transit_cnt INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '在途數據',
  average_cost DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '移動加權成本',
  modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_wpid(wp_id)
)ENGINE = innodb COMMENT '商品庫存表'
  • 物流公司信息表(shipping_info)
CREATE TABLE shipping_info(
  ship_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  ship_name VARCHAR(20) NOT NULL COMMENT '物流公司名稱',
  ship_contact VARCHAR(20) NOT NULL COMMENT '物流公司聯繫人',
  telephone VARCHAR(20) NOT NULL COMMENT '物流公司聯繫電話',
  price DECIMAL(8,2) NOT NULL DEFAULT 0.00 COMMENT '配送價格',
    modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
  PRIMARY KEY pk_shipid(ship_id)
)ENGINE = innodb COMMENT '物流公司信息表';

DB規劃

  • 爲以後數據庫遷移提供方便

  • 避免跨庫操作,把經常一起關聯查詢的表放到一個DB中

  • 爲方便識別表所在的DB,在表名前增加庫名前綴

  • 用戶數據庫(mc_customerdb)

    • customer_inf
    • customer_login
    • customer_level_inf
    • customer_login_log
    • customer_point_log
    • customer_balance_log
  • 商品數據庫(mc_productdb)

    • product_info
    • product_pic_info
    • product_category
    • product_supplier_info
    • product_comment
    • product_brand_info
  • 訂單數據庫(mc_orderdb)

    • order_master
    • order_detail
    • order_customer_addr
    • order_cart
    • shipping_info
    • warehouse_info
    • warehouse_product

參考

  1. 高性能可擴展MySQL數據庫設計及架構優化 電商項目,sqlercn,https://coding.imooc.com/class/79.html

關於我:

linxinzhe,全棧工程師,目前供職於某世界500強銀行的金融科技部門(人工智能,區塊鏈)。

GitHub:https://github.com/linxinzhe

歡迎留言討論,也歡迎關注我~
我也會關注你的哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章