天天看點

常見電商項目的資料庫表設計(MySQL版)

轉自:https://cloud.tencent.com/developer/article/1164332

簡介:

目的:

  • 電商常用功能子產品的資料庫設計
  • 常見問題的資料庫解決方案

環境:

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

子產品:

  • 使用者:注冊、登陸
  • 商品:浏覽、管理
  • 訂單:生成、管理
  • 倉配:庫存、管理

電商執行個體資料庫結構設計

電商項目使用者子產品

  • 使用者表涉及的實體
常見電商項目的資料庫表設計(MySQL版)
  • 改進1:第三範式:将依賴傳遞的列分離出來。比如:登入名<-使用者級别<-級别積分上限,級别積分下限
常見電商項目的資料庫表設計(MySQL版)
  • 改進2:盡量做到冷熱資料的分離,減小表的寬度
常見電商項目的資料庫表設計(MySQL版)
  • 使用者登入表(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 '使用者資訊表';      
  • 使用者級别表(customerlevelinf)
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 '使用者位址表';      
  • 使用者積分日志表(customerpointlog)
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 '使用者積分日志表';      
  • 使用者餘額變動表(customerbalancelog)
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 '使用者餘額變動表';      
  • 使用者登陸日志表(customerloginlog)
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)
);      

如何選擇正确的分區類型

如何為customerloginlog表分區

業務場景:

  • 使用者每次登入都會記錄
  • 日志儲存一年,一年後可删除

解決:

  • 使用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;

  • 過期資料歸檔
    • 建立使用者登陸日志歸檔 

      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

    • 分區資料歸檔遷移條件
    • 操作步驟
    1. mysql >= 5.7
    2. 結構相同
    3. 歸檔到的資料表一定是非分區表
    4. 非臨時表;不能有外鍵限制
    5. 歸檔引擎要是:archive

使用分區表的注意事項

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

商品實體

常見電商項目的資料庫表設計(MySQL版)
  • 品牌資訊表(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 '商品資訊表';      
  • 商品圖檔表(productpicinfo)
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 '商品評論表';      

訂單子產品

常見電商項目的資料庫表設計(MySQL版)
  • 訂單主表(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,在表名前增加庫名字首
  • 使用者資料庫(mccustomerdb)
    • customerinf
    • customer_login
    • customerlevelinf
    • customerloginlog
    • customerpointlog
    • customerbalancelog
  • 商品資料庫(mcproductdb)
    • productinfo
    • productpicinfo
    • productcategory
    • productsupplierinfo
    • productcomment
    • productbrandinfo
  • 訂單資料庫(mcorderdb)
    • ordermaster
    • orderdetail
    • ordercustomeraddr
    • ordercart
    • shippinginfo
    • warehouseinfo
    • warehouse_product

參考

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