前陣子要做一個點餐介面供內部使用
市面上已有很多點餐系統,但沒辦法看它的DB設計,所以就自己先做看看
拿了手上的幾家菜單來看,大致有以下幾個條件
1.有些餐點分大小,價錢也不同
2.飲料可加料,不同飲料可加的料也不同
3.早餐店漢堡加蛋(有些+10有些+15),也有漢堡原本就有含蛋(不加蛋可-10)
大致規劃成如下
--商家
SELECT [StoreID] = '91',[StoreName] = 'OO早餐' INTO #TB_Store
UNION SELECT [StoreID] = '92',[StoreName] = 'XX飲料'
--餐點
SELECT [StoreID] = '91', [MealID] = '1', [MealName] = '豬肉堡', [MealMemo] = '101' INTO #TB_Meal
UNION SELECT [StoreID] = '91', [MealID] = '2', [MealName] = '原味蛋餅', [MealMemo] = '104'
UNION SELECT [StoreID] = '91', [MealID] = '3', [MealName] = '玉米濃湯', [MealMemo] = ''
UNION SELECT [StoreID] = '92', [MealID] = '1', [MealName] = '紅茶', [MealMemo] = '105,106'
UNION SELECT [StoreID] = '92', [MealID] = '2', [MealName] = '綠茶', [MealMemo] = '105,106'
UNION SELECT [StoreID] = '92', [MealID] = '3', [MealName] = '奶茶', [MealMemo] = '105,106,107'
--售價
SELECT [StoreID] = '91', [MealID] = '1', [MealSize] = '', [MealPrice] = '35' INTO #TB_MealPrice
UNION SELECT [StoreID] = '91', [MealID] = '2', [MealSize] = '', [MealPrice] = '30'
UNION SELECT [StoreID] = '91', [MealID] = '3', [MealSize] = '大', [MealPrice] = '30'
UNION SELECT [StoreID] = '91', [MealID] = '3', [MealSize] = '小', [MealPrice] = '20'
UNION SELECT [StoreID] = '92', [MealID] = '1', [MealSize] = 'L', [MealPrice] = '30'
UNION SELECT [StoreID] = '92', [MealID] = '1', [MealSize] = 'M', [MealPrice] = '20'
UNION SELECT [StoreID] = '92', [MealID] = '2', [MealSize] = 'L', [MealPrice] = '30'
UNION SELECT [StoreID] = '92', [MealID] = '2', [MealSize] = 'M', [MealPrice] = '20'
UNION SELECT [StoreID] = '92', [MealID] = '3', [MealSize] = 'L', [MealPrice] = '35'
UNION SELECT [StoreID] = '92', [MealID] = '3', [MealSize] = 'M', [MealPrice] = '25'
--客製
SELECT [MemoID] = '101', [MemoText] = '不加蛋', [Price] = -10 INTO #TB_MealMemo
UNION SELECT [MemoID] = '102', [MemoText] = '加蛋', [Price] = 10
UNION SELECT [MemoID] = '103', [MemoText] = '加蛋', [Price] = 15
UNION SELECT [MemoID] = '104', [MemoText] = '不加小黃瓜', [Price] = 0
UNION SELECT [MemoID] = '105', [MemoText] = '加椰果', [Price] = 10
UNION SELECT [MemoID] = '106', [MemoText] = '加珍珠', [Price] = 10
UNION SELECT [MemoID] = '107', [MemoText] = '加布丁', [Price] = 15
SELECT * FROM #TB_Store
SELECT * FROM #TB_Meal
SELECT * FROM #TB_MealPrice
SELECT * FROM #TB_MealMemo
操作上來說,
當我選了XX飲料的紅茶,必須再選擇L或M(#TB_MealPrice有2筆)
但選了OO早餐的原味蛋餅就不用再選(#TB_MealPrice只有1筆)
而選了豬肉堡,會有不加蛋(MealMemo=101)的選項(介面用checkbox)跑出,原本的售價=35-10
若選了XX飲料的紅茶(L),會有加料的選項跑出(加椰果或加珍珠),如果2個都加,價錢就是30+10+10
以上都已實作出來,但這幾天拿到新的菜單,
遇到了沒考慮到的情況:加購省5元或省10元,
以上面的玉米濃湯來說,大杯30小杯20,如果是豬肉堡+玉米濃湯,小杯玉米濃湯就折5元,大杯玉米濃湯折10元
以目前架構,有幾個想法
如果是加在#TB_Meal,像這樣
SELECT [StoreID] = '91', [MealID] = '1', [MealName] = '豬肉堡', [MealMemo] = '101'
SELECT [StoreID] = '91', [MealID] = '4', [MealName] = '豬肉堡+玉米濃湯(大)', [MealMemo] = '101'
SELECT [StoreID] = '91', [MealID] = '5', [MealName] = '豬肉堡+玉米濃湯(小)', [MealMemo] = '101'
只是一旦遇到加購項目很多,整個排列組合下來,菜單項目就變很多很雜,感覺不太好
另一個是加在#TB_MealMemo
SELECT [MemoID] = '121', [MemoText] = '加購玉米濃湯(大)', [Price] = 20
SELECT [MemoID] = '122', [MemoText] = '加購玉米濃湯(小)', [Price] = 15
感覺又不是最佳做法
不知道各位的建議是?或是有不同的做法呢?
感謝!
你的問題非常有趣,這是一個關於數據建模和數據庫設計的問題。在資料庫設計中,我們需要考慮的關鍵是如何能夠正確、有效地模擬我們的業務需求。
在你的情況下,可以考慮添加一個新的表格來處理餐點組合或者優惠套餐的情況。這個表格可以被稱為 "MealCombo" 或者 "Promotions",其中包含了餐點組合的資訊,例如包含哪些餐點以及套餐的總價格。
這個表格可能包含以下欄位:
ComboID:組合的唯一識別碼。
StoreID:商店的ID。
ComboName:組合的名稱,例如"豬肉堡+玉米濃湯(大)"。
ComboPrice:組合的價格。
另外,你還需要一個新的表格來追蹤哪些餐點是屬於哪一個組合的。我們可以稱這個表格為 "ComboDetails",其中包含了每個組合內的餐點。
這個表格可能包含以下欄位:
ComboID:組合的唯一識別碼。
MealID:餐點的ID。
Quantity:餐點的數量。
以下是一個例子:
-- MealCombo表格
SELECT [ComboID] = '1', [StoreID] = '91', [ComboName] = '豬肉堡+玉米濃湯(大)', [ComboPrice] = '50'
SELECT [ComboID] = '2', [StoreID] = '91', [ComboName] = '豬肉堡+玉米濃湯(小)', [ComboPrice] = '45'
-- ComboDetails表格
SELECT [ComboID] = '1', [MealID] = '1', [Quantity] = '1'
SELECT [ComboID] = '1', [MealID] = '3', [Quantity] = '1'
SELECT [ComboID] = '2', [MealID] = '1', [Quantity] = '1'
SELECT [ComboID] = '2', [MealID] = '3', [Quantity] = '1'
這種設計方案可以較好地應對你的需求,並且在未來如果有類似的促銷活動或者新的餐點組合時,可以很方便地擴展。
我投加在#TB_MealMemo
一票
以現有的設計架構而言
只有「主餐點」和「加購」兩種
不必再另定新規則/分類
另一種組合餐的設計
或許在系統設計上比較合理
但考慮實務作業時
客戶點餐一定不會點你的「組合餐」
而是會先點主餐,再加購/減料/客製
這時侯點餐人員用到組合餐的機會幾乎趨近於零