iT邦幫忙

0

點餐系統資料表規劃

  • 分享至 

  • xImage

前陣子要做一個點餐介面供內部使用
市面上已有很多點餐系統,但沒辦法看它的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

感覺又不是最佳做法

不知道各位的建議是?或是有不同的做法呢?

感謝!

其他大多數的設計都有
表頭、表單項目、表尾
例如 A餐 的表頭 可能就是 價格多少折扣多少 餐點名稱
他的項目可能就是包含 漢堡 飲料
接下來 表單項目要有 BOM 結構,餐飲業大多最多兩層
例如 漢堡的BOM 可以分 麵包種類 主要肉類 配菜項目 加項 調味項目
當你在畫面點了漢堡 就會自動出現這個選單讓你點客人要什麼,只要點點點,就會產生這一單這個客人要的漢堡是哪一種,在資料庫內,漢堡只需要一個料號,但是他可以產生幾百種不同的變化,同樣的飲料也是一樣 紅茶 綠茶 豆漿 咖啡 加多少糖 熱的 冷的 加多少冰 要多熱,上面給樓主參考,大多數的點餐系統都是這麼設計的
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
win895564
iT邦研究生 5 級 ‧ 2023-06-26 11:58:48

你的問題非常有趣,這是一個關於數據建模和數據庫設計的問題。在資料庫設計中,我們需要考慮的關鍵是如何能夠正確、有效地模擬我們的業務需求。

在你的情況下,可以考慮添加一個新的表格來處理餐點組合或者優惠套餐的情況。這個表格可以被稱為 "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'

這種設計方案可以較好地應對你的需求,並且在未來如果有類似的促銷活動或者新的餐點組合時,可以很方便地擴展。

wu2960 iT邦新手 2 級 ‧ 2023-06-26 14:50:25 檢舉

這語法口氣好像是ChatGPT產生的?
我後來把問題丟上去問,得到的建議也是用一個table紀錄優惠組合
就先試看看吧XD

win895564 iT邦研究生 5 級 ‧ 2023-06-26 17:35:26 檢舉

沒錯 哈哈哈

0
海綿寶寶
iT邦大神 1 級 ‧ 2023-06-28 07:26:39

我投加在#TB_MealMemo一票
以現有的設計架構而言
只有「主餐點」和「加購」兩種
不必再另定新規則/分類

另一種組合餐的設計
或許在系統設計上比較合理
但考慮實務作業時
客戶點餐一定不會點你的「組合餐」
而是會先點主餐,再加購/減料/客製
這時侯點餐人員用到組合餐的機會幾乎趨近於零

我要發表回答

立即登入回答