一個成功的管理系統 = 50% 業務理解 + 50% 軟體實現;而軟體成功又 = 25% 資料庫設計 + 25% 程式碼品質。資料庫是企業的「血液」,設計優劣直接決定系統壽命與擴展性。本文彙整 60 項實戰精華技巧,分五大面向助您避開設計陷阱。
新系統鮮少從零開始。研究舊系統(含手工流程)能發現隱性需求與潛在陷阱。
Customer)。CUST, ORDR, INVD)。WORK_。_N、字串型 _C、金額 _M、日期 D_ 前綴。RPT_, QRY_, VW_。tbl_, qry_;SQL Server 預存程序 sp_、函數 udf_。推薦 PowerDesigner(支援 30+ 資料庫、ODBC 連接、PB/VB/Delphi 代碼生成)。
《Data Model Resource Book》(Len Silverston 著)涵蓋人員、組織、效能等通用模型。
詢問用戶未來變化點,預留彈性;分享團隊踩坑經驗,避免重蹈覆轍。
CASE 工具支援高層邏輯模型,讓整體結構清晰可控。
未 100% 確認業務滿足度前,別畫一張 ER 圖。用客戶術語溝通,用「可能/將會/必須」表達基數。
含欄位型別、PK/FK、用途、別名。文檔越早越好,溝通成本越低。
手繪紙筆即可,重點在邏輯關係能落地產生效益。
先看報表/查詢/視圖需求,再決定表結構。例:報表需按郵遞區號分組 → 必須獨立 ZipCode 欄位,不可塞進 Address。
批次/線上?日/週/月/季/年?考慮建立摘要表。系統生成 PK 在報表難管理,建議保留業務副鍵。
別信文檔,要讓客戶講、畫、改。持續確認,避免「只有看見才知道要什麼」的返工地獄。
如姓氏變更(婚姻),建獨立表存 LastName, StartDate, EndDate 追蹤歷史。
拒絕 cbo1, txt2_b 類匈牙利+序號命名。可讀性與長度平衡(CustShipAddrLine1 優於 Customer_Shipping_Address_Street_Line_1)。
多表皆有 FirstName → CusFirstName, EmpFirstName。
利於問題追查、重跑、清理舊數據。
外部介接參數、工作流參數存資料庫表,而非硬編碼。策略變更只改數據,不動代碼。
3NF 原則:值唯一、行唯一標識、非鍵不依賴其他鍵。但餐飲分析案例證明:反正規化可將 40 秒查詢降至 2 秒。反正規化視為「派生物」,源表異動時重建即可。
向導生成表單/報表時直接可讀。
加 IsActive 或 DeletedFlag,查詢過濾、防誤刪、新用戶上手安全。
別在 Person 加 Title,改用 Person + PersonType 關聯,職位變動只改關係鍵值+時間戳,完整保留歷程。
二級具體化:Person→Employee/Client/Patient;Organization→Dept/Competitor/Hospital。降低冗餘、提高彈性。
郵遞區號非全球通用(紐西蘭無),預留彈性長度與格式。
發現重複輸入 → 新表 + 關係。
dRecordCreationDate(預設 Now()/GETDATE())sRecordCreator(預設 USER)nRecordVersion(版本戳,解釋 NULL/遺失)AddrLine1/2/3 + 電話/郵件獨立表含類型標記。高頻訪問時,父表存「首選」資訊妥協效能。
單一 Name 是新手作法。查詢時用計算欄位或 View 組合,隔離應用與開發介面。
全大寫 + 底線(CUSTOMER_DATA),無空格,跨平台最安全。
DESC 是 DESCENDING 保留字,作欄位名會導致 SELECT * 回傳垃圾資訊。
同義欄位名稱、型別必須一致(AgreementNo 不可在另一表叫 Ref1;INT 不可變 VARCHAR)。
SMALLINT 上限 32,767,月銷售額極易溢位,建議用 INT 或 BIGINT。
關係資料庫勿物理刪除行,配合清理程序維護索引完整性。
除錯干擾大、邏輯隱蔽。必用時集中文檔化。
資料庫表存版本號(DB_Version),比掃描欄位/索引判斷結構版本更直觀。
10 碼客戶號設 12-13 碼。100 萬行只增 ~3MB,卻免日後重構之痛(身份證 15→18 碼教訓)。
Customer 表 cu_,Order 表 or_。多表連接時 cu_NameID = or_CustNameID 免別名,字少、錯少。
案號拆解 Year, Serial, Type, DefendantCode 為獨立索引欄位,避免 LIKE 全掃,報表快數倍。
DW 鍵由業務定義,DBA 需平衡效能與正確輸出。
掌控索引完整性、避免人為輸入錯誤、邏輯缺陷易發現。
主鍵亦可拆解組成元素建索引,加速 LIKE 與範圍查詢。
邏輯 PK → 唯一叢集索引;系統鍵 → 唯一非叢集;FK → 非叢集。但索引如鹽,過多傷寫入與空間。別索引 Memo/大文本欄位。
頻繁 INSERT/DELETE 的小表,索引維護成本超過全掃描。
隱私法規、手工輸入易錯、非法竊盜風險。既是序號也違法。
業務變更需改鍵值 → 級聯更新地獄、完整性崩壞。設計適應用戶,非用戶適應設計。
PK 實現跨表關聯。改 CustomerID 必須級聯改所有 Order 記錄,否則孤兒資料產生。RI 約束下幾乎無法安全改鍵。
如 StateCode 在嚴格受控域表中可作 PK,減少 Join,但勿濫建後續鍵增加負載。
主表+關聯表查詢每次用到。Memo/大文本別索引。
資料庫層用 CHECK、FK、NOT NULL、UNIQUE;應用層驗證可變。錯誤訊息需轉為用戶可讀語言。
標準化、觸發器輔助寫入驗證。別依賴應用層保證跨表完整性(FK 做不到)。
同步標記欄位、批次排程傳輸、本地常數版本化。
髒數據進庫前擋下,逼開發者處理錯誤條件。
事後轉換極痛苦。
應用只對 View,結構變更自由度大增。
資料字典發布給開發/用戶、線上更新腳本備份、重跑機制。
資料庫不只是存數據,也是簡化編碼的引擎。
下拉選單減少輸入錯誤,保證一致性(國家碼、狀態碼等)。
工具支援物件註釋,長遠看省維護成本。
下拉/報表按中英文排序,編碼旁註說明。會計懂 4XF788-Q,新人不懂。
版本號、最後檢查時間、設計文檔連結、客戶資訊。非 C/S 環境特別實用。
真實用戶數據上線前必跑,確認資料型別滿足業務。
每種輸出原型對應檢查模型取數路徑。
主表放主容器,專用表放獨立容器,簡化權限與模組劃分。