iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
ChatGPT & Codex

窮鬼冰箱升級計劃系列 第 8

【Day 8】冰箱內容與資料的保存

  • 分享至 

  • xImage
  •  

前言

  1. 因為前面只先想到資料,是照片,從手機或是冰箱上的進料鏡頭傳圖片過來,還有其他的情境要想喔。
  2. 使用者 -> 連入 Pi 上的網頁直接查看內容、管理頁面庫存
    • 冰箱現在有什麼?
    • 牛奶還剩多少?
    • 這盒蛋什麼時候放進來的?
    • 哪些東西三天內到期?
    • 這個 Barcode 是什麼商品?
    • 這張照片是哪個 ESP32 拍的?
    • 這個食材為什麼出現在庫存?
    • 昨天拿出了哪些東西?
    • 這盒牛奶已經放多久?
    • 目前庫存可以做什麼料理?

區分「商品」、「庫存品」

  • 在設計進銷存系統時,一個常被混淆的名詞,以下直接舉例

商品 / Product

光泉鮮乳 936ml

庫存品 / Inventory

光泉鮮乳
2026/09/22 放進冰箱
2026/09/30 到期
剩下 1 瓶

錯誤示範

  • 如果設計一個表格,包含了品項名稱、條碼、有效期限等,那就會直接把商品資料本次的進貨產生的庫存品混在一起。
Food
├── name
├── barcode
├── quantity
├── expiration_date
└── added_at
  • 假設買了兩罐或是很多罐,就不好區分了...
  • 所以合理的做法,要拆開上面這兩件事情,商品型錄就是商品型錄
  • 進貨產生的庫存,就是進貨這個事件,所產生的進貨資料

ER Model

來複習一下資料庫 ...

  • Entity–Relationship Model 從字面上看,就是利用 實體-關係 去設計資料表的方法。
  • 必須關注
    • 實體有哪些需要記載的屬性
    • 實體與實體之間的關係是什麼
    實體 Entity
       │
       ├── 屬性 Attribute
       │
       └── 關係 Relationship
    
  • 核心組成元件
    • 實體(Entity):現實生活中可獨立存在的事物或概念。
      • 例如:光泉鮮乳
      • 在圖表中以矩形表示。
    • 屬性(Attribute):用來描述實體的性質或特徵。
      • 例如:條碼、有效期限、容量、剩餘量、成分
      • 在圖表中以橢圓形表示。
    • 關聯(Relationship):實體之間的連結或互動。
      • 例如:阿美放進一瓶光泉鮮乳
      • 在圖表中以菱形表示。

第一個 Entity / 商品 Product

  • 列出每一瓶光泉鮮乳所擁有的屬性
    光泉鮮乳 A
    品牌:光泉
    名稱:光泉鮮乳
    Barcode:471xxxxxxx
    
    光泉鮮乳 B
    品牌:光泉
    名稱:光泉鮮乳
    Barcode:471xxxxxxx
    
  • 因為他們從當作「商品」而言,區別「是否為同一種商品呢,還是不同種商品」的問題來說,答案是屬於「同一種商品」,因此不該不分開看待
  • 拆出共同擁有的屬性後,將其進行抽象,產生 Entity
    ┌────────────────────────┐
    │        Product         │
    ├────────────────────────┤
    │ id                     │
    │ barcode                │
    │ name                   │
    │ brand                  │
    │ category               │
    └────────────────────────┘
    

第二個 Entity / 庫存品 InventoryItem

  • 列出每一瓶放進冰箱的品項
    1. 第一罐牛奶
      光泉鮮乳 A
      
      放入冰箱:9/22
      到期:    9/27
      數量:    1
      
    2. 第二罐牛奶
      光泉鮮乳 B
      
      放入冰箱:9/22
      到期:    10/01
      數量:    1
      
  • 描述了實際買回來的東西...基於「庫存品」的本質上,存在了不同時間過期的差異,此時因為需要各別管理,每一個都應該分開記載
  • 拆解出需要被記載的資料欄位
    ┌────────────────────────┐
    │     InventoryItem      │
    ├────────────────────────┤
    │ id                     │
    │ product_id             │
    │ quantity               │
    │ added_at               │
    │ expiration_date        │
    │ status                 │
    └────────────────────────┘
    
  • 兩筆資料分別會寫成...
    • 第一瓶
    InventoryItem #101
    
    product_id     = 1
    quantity       = 1
    added_at       = 2026-09-22
    expiration_date= 2026-09-27
    status         = IN_STOCK
    
    • 第二瓶
    InventoryItem #102
    
    product_id     = 1
    quantity       = 1
    added_at       = 2026-09-22
    expiration_date= 2026-10-01
    status         = IN_STOCK
    

Entity 之間的關聯是 ...?

  • 進貨品 和 商品 的關聯...
    • 進貨品,是被放到冰箱裡的商品,要特別注意有效期限
                    Product
               「光泉鮮乳」
                        │
                        │
                      1 │
                        │
                        │
                      N │
               ┌────────┴────────┐
               │                 │
               ▼                 ▼
        InventoryItem       InventoryItem
            #101                #102
    
          9/27 到期           10/01 到期
    
  • 所以這個範例中,商品和庫存庫存品之間,是 One-to-Many Relationship,1:N

用 Primary Key / Foreign Key 把關係建立起來

  • 主鍵 Primary Key 在每一張表格中,必定存在唯一性。
  • 建立商品表 Product
    Product
    ────────────────────────
    id          1
    barcode     471xxxxxxx
    name        光泉鮮乳
    brand       光泉
    
  • 建立冰箱庫存品表 InventoryItem
    InventoryItem
    ────────────────────────────────────
    id     product_id    expiration_date
    101        1          2026-09-27
    102        1          2026-10-01
    
  • 在庫存品表中 product_id指向了 商品表內的一樣商品,透過的 product_id = 1 這個 product_id 就是外部鍵 Foreign Key

關係

Product
────────────────
PK id = 1
name = 光泉鮮乳
       ▲
       │
       │ FK product_id
       │
 ┌─────┴─────────────┐
 │                   │
 │                   │
InventoryItem     InventoryItem
────────────────  ────────────────
PK id = 101       PK id = 102
FK product_id=1   FK product_id=1
expire=9/27       expire=10/01

小結

  • 表格先不要創一堆,今天就先這兩個
  • 設計系統時不可能一次到為,所以不用糾結有沒有「先想到」⋯⋯多得是你想了一堆,到頭來可能也沒派上用場

上一篇
【Day 7】理解 FastAPI 和 Uvicorn
系列文
窮鬼冰箱升級計劃8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言