iT邦幫忙

10

訂便當系統的table 規劃設計討論

假設要設計一個訂便當的系統,只有雞腿便當與排骨便當兩種選項,
除了單選其中一種,也有兩種均可的選項.
當然會有個table,這時候你會怎樣設計此table?
會用哪種資料型態? index 會怎樣使用?

===============
先感謝大家的熱情回應,我來補充一下情境.

假設是在一個學校.
每個同學都有獨一無二的學號.
午餐便當是均一價錢,所以不用考慮收費.
因為只有兩個供應商,好吃雞腿與排骨大王,
廠商油鍋有限,同學們也都了解此一情況,
為了避免某日過於集中一種選項,導致廠商來不及供貨,
影響同學們用餐時間.
經過同學們的一番討論,決定推派你來設計一個簡單的系統.

(1)要能讓同學們可以方便使用學號來登入,選擇品項.
(2)要能方便紀錄選項.
(3)會有兩種均可的選項,是為了方便後續可以調整盡量將
當日雞腿與排骨總數量趨近,以避免影響供餐.但是在此
階段先不用考慮後續調整的方式,只需紀錄選項即可.
(4)只需考慮當日.
(5)在截止時間前,同學們是可以修改個人選擇品項的,只需考慮個人,
不需要考慮班級的情況.
(6)因為是只考慮當日的情況,加上所有的人員都是校內同學,所以系統
可以在每日初始時,透過學生名單,建立初始的情況.
(7)初始情況的選項,就是都沒有選擇,也就是不吃.
(8)一個人只能訂一個便當.價錢也是一樣的.所以不用紀錄數量價格.

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2021-11-26 12:57:01 檢舉
?你問這種問題我會覺得是不是被盜帳號。XD
討論看看,這裡面有很多可以討論喔.
我也被嚇到XD...盜帳號+1
如果是玩玩題OK
harrytsai iT邦新手 2 級 ‧ 2021-11-26 13:15:08 檢舉
連我沒寫程式的都知道,table當然是商品,內容當然是流水號,完全不知道你想問的重點在哪裡
froce iT邦大師 1 級 ‧ 2021-11-26 13:22:48 檢舉
至少我會想到這個會涉及正規化的問題,理論上來說像我下面的設計是不符合正規化和系統彈性的,但目前題目的量體實在太小,正規化太嚴格反而耽誤開發速度和增加開發難度。
rogeryao iT邦大師 1 級 ‧ 2021-11-26 13:46:18 檢舉
這都是幻覺,嚇不倒我的!
froce iT邦大師 1 級 ‧ 2021-11-26 14:28:15 檢舉
> 這都是幻覺,嚇不倒我的!

當這是面試官問你的問題的時候。XD
雷N iT邦新手 1 級 ‧ 2021-11-26 15:18:48 檢舉
我想吃菜飯 (被揍)
froce iT邦大師 1 級 ‧ 2021-11-26 15:33:20 檢舉
哇,這個情境就真的有點挑戰性了。
有沒有不吃的選項?
不吃的選項,就是初始值,補充說明了.
很感謝大家熱烈的響應. 我比較想要偏向討論 紀錄 同學們訂購雞腿排骨那個table.
你會怎樣設計,使用的資料型態, index 會怎樣設計.
例如怎樣防範輸入了蟹堡?
例如index 怎樣設計? 以利於有效統計,以及快速讓同學查詢到他個人的訂購品項.當然 每個人只查自己的,這裡先不考慮資安,就是單純的快速查到.
實務上,菜單跟點餐內容都用JSON字串存檔 可以保有格式自由的特性,畫面是用菜單的JSON GEN出來的。
4
froce
iT邦大師 1 級 ‧ 2021-11-26 13:16:09
Student
ID|long uint
Name|vchar
Order(每日時限後建立次日初始表)
ID|long uint
Student_id|long int(FK)
Order_type|byte(0、1、2、3)
Date|datetime

Order_type:0不訂、1雞腿、2排骨、3皆可
不過這個我會用程式語言去分配,不會純用SQL去做,畢竟我SQL真的不是很熟。
先從全部學生扣除不訂的學生,除以2,得到平均便當數
看是雞腿還是排骨超過平均數,把皆可的加在少的。並且update Order_type
都沒超過就先:

select * from "Order" where Order_type = 1 order by Random() limit (平均-雞腿)

並且把這些都update成雞腿,剩下皆可的就排骨

不是好辦法,但是如果要彈性一點的好像都會很複雜。

有補充情境了.

設計的不錯! 還把後面處理平衡的都設計了!

3
海綿寶寶
iT邦大神 1 級 ‧ 2021-11-26 14:12:35

改題目就改答案

https://ithelp.ithome.com.tw/upload/images/20211126/20001787V8QIaiZSO2.png

CREATE TABLE bdorder
(
studentno varchar(10) KEY,
choice varchar(02),
orderdate datetime
);


REPLACE INTO bdorder VALUES ('ST001', 'CL', '2021-11-25');/*訂雞腿*/
REPLACE INTO bdorder VALUES ('ST002', 'PB', '2021-11-25');/*訂排骨*/
REPLACE INTO bdorder VALUES ('ST003', 'PB', '2021-11-25');/*訂排骨*/
REPLACE INTO bdorder VALUES ('ST004', 'LP', '2021-11-25');/*兩個我都要*/
REPLACE INTO bdorder VALUES ('ST005', 'LP', '2021-11-25');/*兩個我都要*/
REPLACE INTO bdorder VALUES ('ST006', 'LP', '2021-11-25');/*兩個我都要*/

REPLACE INTO bdorder VALUES ('ST001', 'CL', '2021-11-26');/*訂雞腿*/
REPLACE INTO bdorder VALUES ('ST002', 'PB', '2021-11-26');/*訂排骨*/
REPLACE INTO bdorder VALUES ('ST003', 'LP', '2021-11-26');/*訂排骨*/

/* 統計要吃雞腿的 */
SELECT count(*) FROM bdorder WHERE orderdate=CURDATE() AND choice='CL';

/* 統計要吃排骨的 */
SELECT count(*) FROM bdorder WHERE orderdate=CURDATE() AND choice='PB';

/* 統計要吃兩個的 */
SELECT count(*) FROM bdorder WHERE orderdate=CURDATE() AND choice='LP';

(1)要能讓同學們可以方便使用學號來登入,選擇品項.

我想登入在本題不是重點

(2)要能方便紀錄選項.

一個學生一個欄位,超方便

(3)會有兩種均可的選項,是為了方便後續可以調整盡量將
當日雞腿與排骨總數量趨近,以避免影響供餐.但是在此
階段先不用考慮後續調整的方式,只需紀錄選項即可.

已定義代碼表示此種情形,就是 LP

(4)只需考慮當日.

每筆都有「下訂日期」,只有下訂日期=CURDATE()為當日

(5)在截止時間前,同學們是可以修改個人選擇品項的,只需考慮個人,
不需要考慮班級的情況.

不用你說,我壓根兒就不打算要考慮

(6)因為是只考慮當日的情況,加上所有的人員都是校內同學,所以系統
可以在每日初始時,透過學生名單,建立初始的情況.

我大概知道您在暗示什麼,不過我不會上當的

(7)初始情況的選項,就是都沒有選擇,也就是不吃.

只有「下訂日期」=CURDATE() 的才算數,其他都管他去餓肚子

(8)一個人只能訂一個便當.價錢也是一樣的.所以不用紀錄數量價格.

不用記錄的規格最棒了

看更多先前的回應...收起先前的回應...

有補充情境了.

WQ iT邦新手 2 級 ‧ 2021-11-26 15:28:22 檢舉

少了日期

為什麼沒有美味蟹堡
/images/emoticon/emoticon09.gif/images/emoticon/emoticon09.gif/images/emoticon/emoticon09.gif

有補充情境了.

改答案了,請多多指教

CL -> Chicken Leg
PB -> Pig Bone
LP -> chicken Leg or Pig bone
是這樣嗎?

果然是大師,什麼都瞞不過您的法眼
/images/emoticon/emoticon62.gif

4

就題目而言, 在不考量地址客戶的情況下
基本的欄位如下

訂單號 A便當數 B便當數

這是看到題目最直覺的處理方式。但不考量未來性。

但就正規化而言來說。

我會用至少3張表,也就是常見的訂單系統。

訂單表:訂單ID,訂單號..........(其它依需求增加)
訂單商品表:訂單ID(index),商品ID(index),數量
商品表:商品ID,商品名稱(便當名)

當然以上只單純針對訂單的欄位為主,還未考量價格、特價、客戶等等相關資料。

有補充情境了.

突然就增加那麼多@@"
我就不考量登入了。雖然還是會有一個學生表就是了

簡單處理

學生表: 學生ID(主鍵) 、學號、密碼

對應選購便當: 學生ID(索引)、日期(Ymd 索引)、A便當數(預設0)、B便當數(預設0)

這樣子只要主表是學生,去JOIN便當表帶入今日日期就行了。
這是簡單的處理方式。如果不記錄的話,連日期都可以省下來了
搞不好也只要一張表就行了

如要正規化的話....嗯。有點懶的打字了。我想到再補

只考慮當日,也不用考慮帳務.

2
Yaowen
iT邦新手 3 級 ‧ 2021-11-26 16:09:56

---學生資料表---
studentId key 學生編號
studentName 學生姓名
password 密碼

---訂單主檔---
ordersId key 訂單編號
studentId key 學生編號
termdate 訂單日期
termtime 訂單時間
qty 訂單總數量
memo 訂單備註
flag 狀態 0 為初始正常 -1 作廢 1 不可改單

---訂單明細---
ordersId key 訂單編號
studentId key 學生編號
itemNo key 項目
materialID 商品編號
qty 訂單數量
flag 0 為初始正常 -1 作廢 1 不可改單

---商品主檔---
materialID key 商品編號
materialName 商品名稱

大致上是這樣
如果要改單看原單要不要保留改flag -1 重新在新增一筆

4
japhenchen
iT邦超人 1 級 ‧ 2021-11-26 16:44:55

這是我四年前用ASP.net+jQuery寫的,想在公司裡用
(全公司300多人每天光訂便當的事就人仰馬翻)
但.......之後熊貓興起,這個訂便當系統就.....被淹沒

人員資料接入公司AD,所以不用建訂購人的資料

(沒想到還能working耶,現在執行起來,超柔順....)
https://ithelp.ithome.com.tw/upload/images/20211126/20117954ZPIzfAlm2u.jpg
https://ithelp.ithome.com.tw/upload/images/20211126/20117954RCgvwzjfET.jpg
https://ithelp.ithome.com.tw/upload/images/20211126/20117954RC4O2ruUit.jpg
https://ithelp.ithome.com.tw/upload/images/20211126/20117954kj8ahbMJJr.jpg
https://ithelp.ithome.com.tw/upload/images/20211126/20117954X7uRf67SW5.jpg
https://ithelp.ithome.com.tw/upload/images/20211126/20117954H4E9manZqV.jpg

大大這個系統很威.
我那個只是要做簡單情境的討論用的,所以只有雞腿排骨.

setsuna iT邦新手 4 級 ‧ 2021-11-27 22:45:28 檢舉

你們公司應該在台南永康附近吧
因為這幾家都是我們有時會訂的店

setsuna
慘惹...被你抓到,緊來酸~~哈哈

就是以這幾家建檔來玩的咩....公司在永康科技園區沒錯

3
rogeryao
iT邦大師 1 級 ‧ 2021-11-26 20:38:50

帳密 TABLE :

學號
姓名
密碼

訂單容許訂購數量 TABLE :

供應商 : A (雞腿)、B (排骨)
數量
優先權 : 先滿足 A 或是 B

訂單 TABLE :

日期
學號
選項 : 空白 (不訂)、A (雞腿)、B (排骨)、C (兩種均可)
選項(調整) : 處理兩種均可(截止後由系統統計數量後填入 A 或 B,並且不超過訂單容許訂購數量)
截止 : Y/N

1.廠商油鍋有限 : 先訂先贏,用【訂單容許訂購數量】控制訂單(雞腿/排骨)上限
2.避免某日過於集中一種選項 : 用【選項(調整)】
3.數量統計 = 選項(A/B) + 【選項(調整)】(A/B)

供應商是兩家, 好吃雞腿與排骨大王. 我們先不用考慮他們的供應能力啦,不過你要想得更進一步,也是不錯.

rogeryao iT邦大師 1 級 ‧ 2021-11-26 21:19:50 檢舉

【供應商容許接單量】=> 改成【訂單容許訂購數量】應該較適宜
例如 :
學生 60 人,A (雞腿)容許訂購數量 28 (優先滿足),
就只能有 28 位訂購 A (雞腿),其餘較晚訂購者只能訂 B (排骨)或是兩種均可,
其中兩種均可在選項(調整)後皆會變成 B (排骨)

2
ckp6250
iT邦好手 1 級 ‧ 2021-11-28 14:33:54

若是推派我來設計的話,我絶不允許【兩種皆可】這個選項,尤其是女同學!

我吃了太多虧了,每回我問太座,中午吃什麼?當她回答【都可以】的時候,我就知道大禍臨頭啦。

哈哈,兩者皆可,混沌狀態....

ckp6250 iT邦好手 1 級 ‧ 2021-11-28 17:38:55 檢舉

例如index 怎樣設計? 以利於有效統計,以及快速讓同學查詢到他個人的訂購品項.當然 每個人只查自己的,這裡先不考慮資安,就是單純的快速查到.

要【單純的快速查到】,就要避開混沌不明的情境,萬一有大胃王,要吃二個便當,但都是【兩種皆可】,系統的自動分配就會更複雜困難,自砸腳根。

再往後考慮,萬一有廿種口味,又都是【廿種皆可】,我倒想看程式怎麼設計哩,人無遠慮,必有近憂。

1
ryankaka
iT邦新手 5 級 ‧ 2021-12-21 21:34:33

我來設計絕不接受可以複選或是兩者皆可或是不吃這幾種選項
對於選擇障礙的人來說,那是一大考驗
但我覺得可以推出推薦便當 每周輪流我覺得這個很棒

我要發表回答

立即登入回答