資料庫設計心得——微信銷售小程式
我們團隊專案是微圖書銷售小程式,根據需求一共設計了12個表和兩個檢視(cart_view,order_detail_view)。
小組:3班6組
我們小團隊在設計資料庫所花花時間一共是兩週,從設計到完成匯入資料進行測試。
在設計這個資料庫過程有挺多挫折的,首先就是需求的變化,在每一次見指導老師都會有需求的變化,導致資料庫之前設計出的版本繼續修改,但是這樣我們團隊在設計資料庫過程中學會了考慮需求變化而對資料庫進行可拓展的設計。
接下來講一下我們的資料庫:
一共 12個表:
分別是使用者資訊表,收貨地址表,使用者收藏表,購物車表,店鋪資訊表,圖書基本資訊表,圖書型別表,圖書詳情與圖書型別關係表,圖書評價表,訂單表,訂單明細表,訊息隊列表
- 使用者資訊表:
實體描述:
實體編號 |
實體名稱 |
實體命名 |
01 |
使用者表 |
user_table |
實體說明 |
使用者的基本資訊 |
使用者實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
user_id |
varchar(30) | 是 |
否 |
否 |
無 |
使用者id |
為使用者在微信小程式中的openid,唯一標識使用者 |
store_id |
int |
否 |
是 |
是 |
無 |
店鋪id |
當用戶為賣家時該值指向使用者的店鋪 |
birthday |
date |
否 |
否 |
是 |
無 |
生日 |
使用者的出生日期 |
sex |
char(1) |
否 |
否 |
是 |
無 |
性別 |
使用者的性別 |
user_type |
int |
否 |
否 |
否 |
0 |
使用者型別 |
設定了四種使用者型別,對應0-3 |
phone |
varchar(11) |
否 |
否 |
是 |
無 |
電話號碼 |
使用者的電話號碼 |
vip_level |
int |
否 |
否 |
否 |
0 |
vip等級 |
使用者的vip等級 |
consumption |
double |
否 |
否 |
否 |
0 |
消費總計 |
使用者從註冊到目前消費的總額 |
單一個 使用者資訊表可以實現使用者登入和使用者基本資訊修改功能,使用者登入時候獲取他的user_id,這個user_id將作為小程式端的全域性變數,在以後的互動過程中經常呼叫。比如修改使用者基本資訊。這時候需要用到該表的birthat,sex,phone欄位,使用者的操作會影響這些欄位的更新。其次,user_type欄位是我們考慮到,二期迭代開發每個使用者可以有其他使用者模式,比如圖書管理模式,就是商家,或者是高階管理員模式,亦或是同時是商家也是高階管理員模式(這3種使用者本身也有普通使用者模式),商家和高階管理員模式可以行使不同的功能,比如商家可以擁有自己的店鋪,就是表中的store_id,而高階管理員是對軟體的維護。而表中的consumption是記錄使用者消費金額,這個會影響使用者的Vip_level
2.收貨地址表:
實體描述:
實體編號 |
實體名稱 |
實體命名 |
01 |
address_table |
address_table |
實體說明 |
使用者收貨地址表 |
收貨地址實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
address_id |
int |
是 |
否 |
是 |
無 |
地址編號 |
唯一標識地址資訊 |
user_id |
varchar(30) |
否 |
是 |
是 |
無 |
使用者編號 |
使用者編號 |
phone |
varchar(11) |
否 |
否 |
是 |
無 |
手機號碼 |
收貨人電話 |
recevier |
varchar(30) |
否 |
否 |
是 |
無 |
收貨人姓名 |
收貨人的姓名 |
receiver_address |
Varchar(100) |
否 |
否 |
是 |
無 |
收貨人地址 |
收貨人地址 |
收貨地址表與使用者資訊表關聯,外來鍵user_id確定是哪個使用者,然後找到該使用者的具體收貨地址,這個表可以實現使用者對自己收貨地址的增刪改查的操作
3.使用者收藏表:
實體描述:
實體編號 |
實體名稱 |
實體命名 |
02 |
collect_table |
collect_table |
實體說明 |
使用者收藏書籍或者店鋪表 |
使用者收藏實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
collect_id |
int |
是 |
否 |
是 |
無 |
收藏編號 |
收藏資訊唯一識別符號 |
user_id |
varchar(30) |
否 |
是 |
是 |
無 |
使用者編號 |
使用者唯一識別符號 |
object |
int |
否 |
否 |
是 |
無 |
收藏物品 |
收藏物品 |
collect_type |
int |
否 |
否 |
是 |
無 |
收藏型別 |
收藏的型別 |
主鍵是collect_id,外來鍵是user_id,與使用者資訊表關聯,可以實現使用者對自己收藏的增刪改查操作,同時collect_type是區分使用者收藏的是書籍還是店鋪,object就是書籍或店鋪的id
4.購物車表:
實體描述:
實體編號 |
實體名稱 |
實體命名 |
02 |
購物車表 |
shopping_cart |
實體說明 |
購物車資訊 |
購物車實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
book_id |
int |
是 |
是 |
否 |
無 |
圖書id |
唯一標識圖書資訊的符號 |
user_id |
varchar(30) |
是 |
是 |
否 |
無 |
使用者id |
唯一標識使用者資訊的符號 |
number |
int |
否 |
否 |
否 |
無 |
圖書數量 |
記錄購物車中每一種圖書的數量 |
購物車表相對簡單,通過user_id和book_id找到使用者購物車中的商品數量和資訊
5.店鋪資訊表:
實體描述:
實體編號 |
實體名稱 |
實體命名 |
02 |
店鋪表 |
store_table |
實體說明 |
店鋪的基本資訊 |
店鋪實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
store_id |
int |
是 |
否 |
否 |
無 |
店鋪id |
用於唯一標識店鋪的id,設定了自增 |
store_name |
varchar(30) |
否 |
否 |
否 |
無 |
店鋪名稱 |
註冊店鋪時設定的店鋪名稱 |
description |
varchar(200) |
否 |
否 |
是 |
無 |
店鋪描述 |
註冊店鋪時設定的店鋪描述 |
create_time |
date |
否 |
否 |
否 |
無 |
店鋪註冊時間 |
註冊店鋪時的時間 |
star_level |
int |
否 |
否 |
否 |
1 |
店鋪星級 |
表示店鋪質量的店鋪星級 |
店鋪資訊表store_id是主鍵,和使用者資訊表裡面的store_id聯絡起來,可以知道店鋪的擁有者,其他欄位即為店鋪基本資訊
6、圖書基本資訊表:
實體描述:
實體編號 |
實體名稱 |
實體命名 |
01 |
圖書基本資訊表 |
Book_table |
實體說明 |
圖書基本資訊 |
圖書實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
book_id |
int |
是 |
否 |
否 |
無 |
自增 |
唯一標識圖書的符號 |
store_id |
int |
否 |
是 |
否 |
無 |
店鋪id |
店鋪id |
book_name |
varchar(40) |
否 |
否 |
否 |
無 |
圖書名 |
圖書名 |
book_description |
varchar(2000) |
否 |
否 |
是 |
無 |
圖書文字描述 |
圖書文字描述 |
picture_description |
varchar(100) |
否 |
否 |
是 |
無 |
圖片描述 |
圖片描述 |
inventory |
int |
否 |
否 |
否 |
無 |
庫存 |
庫存 |
book_author |
varchar(50) |
否 |
否 |
否 |
無 |
圖書作者 |
圖書作者 |
book_press |
varchar(40) |
否 |
否 |
否 |
無 |
圖書出版社 |
圖書出版社 |
price |
int |
否 |
否 |
否 |
無 |
價格 |
價格 |
cover |
varcher(100) |
否 |
否 |
否 |
無 |
封面 |
封面 |
Book_id唯一標識一本書,考慮到不同的店鋪可以賣同一本書,然後對該書的其他資訊描述不同(比如店家介紹,優惠價格),所以同一本書也可以有不同的book_id,inventory這個庫存資訊是我們用來考慮給圖書庫存加閾值時用到的欄位,閾值是多少由後臺確定
7、圖書型別表
實體描述:
實體編號 |
實體名稱 |
實體命名 |
02 |
圖書型別表 |
Book_type |
實體說明 |
圖書型別資訊 |
圖書型別實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
type_id |
int |
是 |
否 |
否 |
無 |
自動編號 |
圖書型別唯一識別符號 |
type |
varchar(20) |
否 |
否 |
否 |
無 |
圖書型別 |
|
單獨設計一個圖書型別表,考慮到第2第3正規化,如果出現某一類書只有一種書如果下架該書籍,那個類別就會消失的問題,所以開設這樣一個表
8、圖書詳情與圖書型別關係表
實體描述:
實體編號 |
實體名稱 |
實體命名 |
03 |
btrelation_table |
btrelation_table |
實體說明 |
圖書詳情和圖書型別的關係表 |
圖書詳情與圖書型別關係實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
book_id |
int |
是 |
是 |
是 |
無 |
圖書編號 |
圖書唯一識別符號 |
type_id |
int |
是 |
是 |
是 |
無 |
型別編號 |
型別唯一識別符號 |
將圖書詳情表和圖書型別表關聯起來的一個表
9、圖書評價表:
實體描述:
實體編號 |
實體名稱 |
實體命名 |
01 |
圖書評價表 |
evaluation_table |
實體說明 |
圖書的評價資訊 |
圖書評價實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
user_id |
varchar(30) |
是 |
是 |
否 |
無 |
使用者id |
唯一標識使用者資訊的符號 |
book_id |
int |
是 |
是 |
否 |
無 |
圖書id |
唯一標識圖書資訊的符號 |
content |
varchar(200) |
否 |
否 |
否 |
無 |
評價內容 |
評價內容詳細資訊 |
圖書評價表,主鍵是user_id和book_id,這個評價不管是哪個使用者登入檢視某本書評價,都會看到某個使用者對該書的評價,例如淘寶
10、訂單表
實體描述:
實體編號 |
實體名稱 |
實體命名 |
02 |
訂單表 |
order_table |
實體說明 |
訂單資訊 |
訂單實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
order_id |
int |
是 |
否 |
否 |
無 |
訂單號 |
訂單資訊唯一識別符號 |
user_id |
varchar(30) |
否 |
是 |
否 |
無 |
使用者id |
使用者資訊唯一識別符號 |
address |
varcher(100) |
否 |
否 |
否 |
無 |
收貨地址 |
收貨地址資訊 |
phone |
varcher(11) |
否 |
否 |
否 |
無 |
收貨人手機號碼 |
收貨人手機號碼資訊 |
receiver |
varcher(30) |
否 |
否 |
否 |
無 |
收貨人姓名 |
收貨人姓名資訊 |
order_time |
date |
否 |
|
否 |
無 |
下單時間 |
下單時間資訊 |
order_state |
varchar(10) |
否 |
否 |
否 |
無 |
訂單狀態 |
訂單狀態 |
訂單詳情表根據外來鍵user_id和使用者資訊表關聯,使用者可以檢視自己的具體訂單資訊,也可以對訂單進行增刪改查,可以修改order_state,即訂單狀態(待付款之類的),也可以修改收貨地址,手機等資訊(但是具體能不能修改要看訂單狀態,這就是具體邏輯了,已發貨肯定不能再改了)
11、訂單明細表
實體描述:
實體編號 |
實體名稱 |
實體命名 |
03 |
訂單明細表 |
orderdetail_table |
實體說明 |
訂單詳情資訊 |
訂單明細實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
book_id |
int |
是 |
是 |
否 |
無 |
圖書標號 |
圖書資訊唯一識別符號 |
order_id |
int |
是 |
是 |
否 |
無 |
訂單編號 |
訂單資訊唯一識別符號 |
book_count |
int |
否 |
否 |
否 |
無 |
訂單中當前圖書數量 |
|
book_totalprice |
double |
否 |
否 |
否 |
無 |
訂單中本圖書總價格 |
|
訂單明細表就是看訂單裡面具體商品的資訊,通過book_id和order_id看到具體的訂單裡面的商品資訊(同一個訂單裡面可以有不同的書,所以這兩個欄位一起作為主鍵),然後ordder_id作為外來鍵和訂單表關聯,訂單表又與使用者資訊表關聯,所以使用者就可以完成檢視訂單裡面具體商品資訊的操作
12、訊息隊列表
實體描述:
實體編號 |
實體名稱 |
實體命名 |
01 |
訊息隊列表 |
message_queue |
實體說明 |
儲存所有的訊息 |
訊息佇列實體屬性列表
屬性名 |
型別 |
是否 主鍵 |
是否外來鍵 |
可否 為空 |
預設值 |
說明 |
備註 |
message_id |
int |
是 |
否 |
否 |
無 |
自動遞增(從1開始) |
唯一標識訊息的符號 |
sender_id |
varchar(30) |
否 |
是 |
否 |
無 |
傳送者id |
|
receiver_id |
varchar(30) |
否 |
是 |
否 |
無 |
接收者id |
|
send_time |
datetime(30) |
否 |
否 |
否 |
無 |
傳送訊息的時間 |
|
message_detail |
varchar(200) |
否 |
否 |
否 |
無 |
訊息內容 |
|
這個表示針對2期迭代的留言功能,具體是買家給賣家留言還是高階管理員與其他使用者互動等等情況要根據send_id 和receiver_id而定。