~/blog/sme-digital-transformation-excel-to-database-design-guide.md
企業系統與 CRM · 2025 / 12 / 30

Excel 只是試算表不是資料庫!中小企業數位轉型:從 VLOOKUP 地獄到關聯式架構的重生之路

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
Excel 只是試算表不是資料庫!中小企業數位轉型:從 VLOOKUP 地獄到關聯式架構的重生之路
目錄 table-of-contents.md

Excel 是試算表,不是資料庫

如果你的客戶名單、庫存與訂單全靠一個叫 2025_客戶訂單_最終版_真的最後一版_v12.xlsx 的檔案撐著,那你面對的不是「還沒數位化」,而是「已經欠下技術債」。出路其實很明確:把核心業務數據從 Excel 搬進關聯式資料庫,靠「正規化」把人、事、物拆開再用 ID 串起來,就能一次解決資料不一致、無法多人協作、髒資料與沒有權限控管這四大痛點。

底下我會用一個訂單系統的實際 Schema,示範 Excel 思維與資料庫思維的差別;接著說明為什麼 WordPress 可以當成中小企業「去 Excel 化」的第一步,以及一套不會引發內部暴動的漸進式遷移步驟。

嗨,我是 Eric。在浪花科技打滾多年,我看過最恐怖的「鬼故事」通常不是伺服器被駭,而是上面那個檔名。這個檔案往往掌握著一家中小企業 (SME) 的命脈:老闆在用、業務在用、倉庫阿姨也在用。然後某天有人按錯一個鍵,或檔案因為太大而損毀,整間公司的運作就瞬間停擺。

「數位轉型」對許多台灣中小企業主來說,常被簡化成「把紙本變成 Excel」。但身為技術人員,我必須殘酷地告訴你:長期依賴 Excel 管理核心業務數據,是你公司最大的隱形技術債。

為什麼你的 Excel 會變成「地獄」?

Excel 是微軟最偉大的發明之一,它是最強大的「計算機」與「草稿紙」,但它絕對不是「資料庫」。當業務規模擴大,Excel 的先天缺陷就會暴露無遺:

  • 資料不一致 (Data Inconsistency):張三在「客戶表」改了電話,但「訂單表」裡的電話還是舊的。因為 Excel 沒有「關聯性」,資料是死的,不會連動。
  • 缺乏多人協作 (Concurrency Issues):雖然現在有 Google Sheets,但當兩個人同時篩選資料或修改同一列時,那個混亂程度簡直是災難。
  • 資料髒亂 (Dirty Data):日期欄位有人填 2025/01/01,有人填 114.1.1,甚至有人填「下週三」。這種資料無法被程式可靠地讀取,也就無法進行自動化分析。
  • 缺乏權限控管 (Security):你很難設定「業務 A 只能看自己的客戶,不能看業務 B 的」。Excel 檔案一傳出去,就是全看光。

一個快速自我診斷的方法

不確定自己有沒有踩雷?問自己三個問題:同一筆客戶資料,是不是抄在好幾個分頁或好幾個檔案裡?你的表格是不是越用越往右邊長(商品 A、商品 B、商品 C……)?要算「某客戶今年總共下了幾張單」時,是不是得靠一堆 VLOOKUP 與手動篩選才湊得出來?只要有一個「是」,你就已經站在地獄的入口了。

資料庫思維:從「平面」到「立體」的進化

要擺脫 Excel 地獄,首先要改變的是「腦袋」。在 Excel 裡,我們習慣把所有東西塞在同一個 Sheet 裡,深怕切換分頁很麻煩。但在關聯式資料庫 (Relational Database) 的世界裡,我們講究的是「正規化 (Normalization)」。

正規化聽起來很學術,但它的核心精神只有一句話:同一件事實只存在一個地方。客戶的電話只存在「客戶表」、商品的價格只存在「商品表」,其他地方需要用到時,不是再抄一份,而是用 ID 去「指向」它。這樣一來,要改電話只改一處,全公司讀到的都是同一個正確答案——這正是 Excel 永遠做不到的事。

簡單來說,就是把「人」、「事」、「物」拆開來存,再用「ID」把它們連起來。

實戰案例:訂單系統的設計差異

假設我們要紀錄一筆訂單,Excel 的思維通常是這樣長長的一列:

[訂單編號] | [客戶姓名] | [客戶電話] | [商品A] | [數量A] | [單價A] | [商品B] | [數量B]...

這種結構看似直觀,但如果客戶買了 10 種商品,你的表格就會無限往右延伸;或者你得重複輸入 10 次客戶姓名,造成資料冗餘 (Data Redundancy)。冗餘不只是浪費空間,它真正的代價是:每一份重複的資料,都是一個未來會跟其他副本對不起來的未爆彈。

身為工程師,我們會這樣設計資料庫架構 (Schema):

1. 客戶資料表 (Customers)

只存客戶的基本資料,給每個客戶一個唯一的 customer_id 當主鍵 (Primary Key)。

CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    phone VARCHAR(20),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 商品資料表 (Products)

只存商品資訊,價格變動時只需改這裡,不用去翻歷史訂單。

CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    sku VARCHAR(50) UNIQUE,
    product_name VARCHAR(255),
    price DECIMAL(10, 2),
    stock_quantity INT
);

3. 訂單主表 (Orders) 與 訂單明細 (Order_Items)

這是最關鍵的一步。我們將「訂單本身」與「訂單買了什麼」分開。一張訂單可以對應多筆明細,這就是典型的「一對多」關係——而 Excel 那種往右無限延伸的欄位,本質上就是在硬塞一個它根本無力表達的一對多關係。

-- 訂單主表:紀錄誰買的、何時買的、目前狀態
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    order_date DATETIME,
    status VARCHAR(50), -- 待付款, 處理中, 已出貨
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- 訂單明細:紀錄這張訂單買了哪些商品
CREATE TABLE order_items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT,
    product_id INT,
    quantity INT,
    unit_price DECIMAL(10, 2), -- 紀錄當下購買價格
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

這裡有一個容易被忽略、卻非常重要的設計細節:order_items 裡為什麼要存 unit_price,而不是每次都去 products 表撈當前價格?因為商品價格會隨時間變動,但歷史訂單必須凍結成交當下的價格。把成交價寫進明細,才不會發生「半年前的訂單跟著今天調價而金額亂跳」的荒謬狀況。這就是資料庫設計裡「哪些資料該關聯、哪些該快照保存」的判斷力。

看到差異了嗎?在這種結構下,透過 customer_idproduct_id 這兩個外鍵 (Foreign Key),我們確保了資料的唯一性一致性。不管客戶改幾次電話,訂單永遠能關聯到最新的客戶資料;不管上了多少新品,資料庫結構都不需要改變——你只是多了幾列 (row),而不是被迫多開幾欄 (column) 或新增分頁。

WordPress 在中小企業數據化中的角色

「Eric,你講那麼多 SQL,我又不會寫程式,難道要去學寫 Code 嗎?」

別擔心,這就是為什麼我推崇 WordPress 作為中小企業數位化的第一步。WordPress 本身就是一個成熟的內容管理系統 (Content Management System, CMS),它的底層就是 MySQL 資料庫。換句話說,你在後台點點按按建立的內容,背後其實早就在跑關聯式資料表了——只是 WordPress 幫你把 SQL 藏了起來。透過一些工具,我們可以把上述資料庫概念「視覺化」:

  • Custom Post Types (CPT):你可以建立「客戶」、「訂單」、「維修紀錄」等自定義內容類型,而不僅僅是內建的「文章」和「頁面」。每一種 CPT,概念上就對應到資料庫裡的一張表。
  • Advanced Custom Fields (ACF):這就是你的欄位設計器。你可以強制規定日期格式、改用下拉選單,避免員工輸入錯誤的資料——這正是前面提到的資料驗證 (Data Validation),從源頭擋掉髒資料。
  • User Roles & Capabilities:WordPress 內建強大的權限系統,解決了 Excel 檔案誰都能看的問題。

當然,WordPress 不是唯一解,規模或流程複雜到一定程度時,客製化系統會更貼合需求;但對「想跨出 Excel、又不想一步登天」的中小企業而言,它是門檻最低、回報最快的起點。

如何開始你的「去 Excel 化」工程?

請不要明天進公司就宣布「我們禁用 Excel」,那會引發暴動。數位轉型是一場溫柔的革命,建議依照以下步驟進行:

  1. 資料盤點與清洗 (Data Cleansing):先把你那堆亂七八糟的 Excel 整理好——統一格式、刪除重複項、補齊缺漏。這是最痛苦但最重要的一步,因為再漂亮的資料庫,灌進髒資料一樣是垃圾進、垃圾出。
  2. 定義核心業務邏輯:畫出你的業務流程圖。訂單進來後要去哪?庫存什麼時候扣?這一步決定了你的資料表要怎麼拆、怎麼關聯。
  3. 選擇工具並小規模導入:可以先從「客戶名單管理」或「派單系統」這類單一痛點開始,不要一次全部上線。利用 WordPress 搭建後台,或使用 Airtable 這類關聯式資料庫工具作為過渡。
  4. 引入自動化 (Automation):當資料結構化之後,你就可以用 n8n 串接 API。例如:WordPress 新增一筆訂單 → 自動發 LINE 通知給業務 → 自動扣除庫存。資料一旦乾淨且結構化,自動化才有立足點。

關於第一步的資料清洗,如果你的客戶資料量大又雜,現在已經可以借助 LLM(大型語言模型)來協助標準化欄位、辨識重複客戶、修補格式不一的紀錄,大幅縮短人工整理的時間。不過自動化前,仍要先人工抽樣驗證結果,避免把錯誤的清洗規則套到全部資料上。

Eric 的工程師碎碎念

我看過太多老闆,花大錢買了昂貴的 ERP 系統,結果員工嫌難用,私底下還是用 Excel 在做事,最後 ERP 變成只是一個「補登資料」的昂貴垃圾。系統是為了解決問題,不是製造問題。

真正的數位化,不是買軟體,而是建立「數據思維」。當你把資料從 Excel 的格子裡解放出來,變成資料庫裡流動的數據時,你才能真正看見公司的全貌,做出精準的商業決策。

這條路不容易,技術債欠久了總是要還的,但越早開始還,利息就越少。

延伸閱讀

// FAQ

常見問題

為什麼長期用 Excel 管理核心業務數據會出問題?
Excel 是強大的試算表與計算工具,但不是資料庫。當業務規模擴大會暴露四大缺陷:資料不一致(改了客戶表電話、訂單表卻還是舊的,因為資料沒有關聯不會連動)、缺乏多人協作、資料髒亂(日期格式各填各的程式無法可靠讀取),以及缺乏權限控管(檔案一傳出去就全看光)。
如何快速自我診斷公司是否已陷入 Excel 管理地獄?
問自己三個問題:同一筆客戶資料是不是抄在好幾個分頁或檔案裡?表格是不是越用越往右邊長(商品 A、商品 B、商品 C……)?要算某客戶今年下了幾張單時,是不是得靠一堆 VLOOKUP 與手動篩選才湊得出來?只要有一個答案是肯定的,就已經站在地獄入口了。
資料庫的「正規化」是什麼意思?
正規化的核心精神是「同一件事實只存在一個地方」。客戶電話只存在客戶表、商品價格只存在商品表,其他地方需要用到時不是再抄一份,而是用 ID 去指向它。這樣要改電話只需改一處,全公司讀到的都是同一個正確答案。實務上就是把人、事、物拆開來存,再用 ID 把它們串起來。
訂單明細表為什麼要另外存單價,而不是每次去商品表撈當前價格?
因為商品價格會隨時間變動,但歷史訂單必須凍結成交當下的價格。如果每次都去撈商品表的當前價格,半年前的舊訂單會跟著今天調價而金額亂跳。把成交價(unit_price)寫進訂單明細,才能正確保存歷史。這體現了資料庫設計中「哪些資料該關聯、哪些該快照保存」的判斷。
不會寫程式的中小企業,為什麼可以用 WordPress 當去 Excel 化的第一步?
WordPress 是成熟的內容管理系統,底層就是 MySQL 關聯式資料庫,後台點按建立內容時其實已在跑關聯式資料表。可用 Custom Post Types 建立「客戶」「訂單」等自訂內容類型(概念對應資料表)、用 Advanced Custom Fields 設計欄位並做資料驗證從源頭擋掉髒資料、用內建的使用者角色與權限系統解決誰都能看的問題。它是門檻最低、回報最快的起點。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?