1. 程式人生 > >常見電商專案的資料庫表設計(MySQL版)

常見電商專案的資料庫表設計(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 '使用者資訊表';
  • 使用者級別表(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從句中包含分割槽鍵
  • 具有主鍵或唯一索引的表,主鍵或唯一索引必須是分割槽鍵的一部分

商品實體

  • 品牌資訊表(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 '商品評論表';

訂單模組

  • 訂單主表(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