2013年9月23日星期一

自製記帳軟件 - DataType


我很佩服那些操作手冊的作者, 可以那麼條理分明的寫出每一個步驟, 每一個動作; 而我每次寫到實作層面的時候總是會退縮不前, 要處理要表達的資訊實在是太多, 而每一項資訊本身就已經充滿了不同的意函, 如果要充分去說明其中的道理和原委, 可能到我力歇那一天都未完成. 傳聞那些操作手冊的作者的稿費相當之高, 能人所不能之價也.

這一篇文章的用意是使大家在繼續我的唐吉訶德之路前, 先對手上的長矛- MySQL - 有一個初步認識. 否則大家只會像是瞎子摸象. MySQL 是一個 Database Management System (DBMS) 軟件, 顧名思義, 她的作用是管理不同的資料庫, 包括保全, 備份及輸入輸出都是她的職責. 而資料的儲存則是 Storage Engine 所負責.  在 MySQL 5.5之前, 預設的 Storage Engine 是 MyISAM, 而在5.5版或之後則是 InnoDB. InnoDB 取代 MyISAM 的原因最主要是穩定與效率. 雖然 InnoDB 會比MyISAM 佔據更多的儲存空間, 但在今天每MB的硬體成本只是港幣十分之一仙, 這個缺點已經變得無足輕重了.


上圖是一位熱心網友所製作的 MySQL Datatype 表的截圖, 完整的表可以在 KIM BRIGGS WEBSITE 中觀看及下載. 你或許會發現這表是根據 MySQL 5.0 版本所製成, 但是到現在仍然是適用的, 畢竟如果把 Schema 看成是根據幾何學繪成的藍圖, 你就不能夠隨便改動其中點線面的定義. 

在我自製的記帳軟件的 Schema 之中, 在考慮了一般記帳的需要, Micosoft Access 的限制和開發難度後, 我只集中地使用了幾種 Datatype, 它們包括了: TINYINT, INT, DECIMAL, VARCHAR, DATE, 及 TIMESTAMP. 或許我應該承認懶惰也是一大因素, 可是為了完成這個唐吉訶德式的壯舉, 我是看書看 Blog 都看到眼睛壊了. 為了讓大家進一步理解 Datatype 的選擇與設計考量, 以下我將會逐一簡單的說明一下:

TINYINT ( 1 byte ) - UNSIGNED 數值範圍從 0 到 255
這個 TINYINT 主要是用來作為 "選項數值", 例如 YES/NO, 表單種類及公司類別等. 記著一點, 由於此 Datatype 的數值範圍很小, 所以只適用一些你可以控制而不會自然增長的地方.

INT ( 4 bytes ) - UNSIGNED 數值範圍從 0 到 4,294,967,295
這個 INT 主要是用來作為 "編號數值", 例如表單編號, 客戶編號及產品編號等. 由於此 Datatype 的數值範圍比較大, 所以適用於一些會自然增長但不需要小數位的地方.

DECIMAL ( M+2 ) - 十進位範圍: 點數位前0到64, 點數位後0到30
這個 DECIMAL 主要是用來作為 "絕對數值", 例如金額及數量等. 由於此 Datatype 的數值範圍很大, 在設置適當的前提下你不會遇到任何限制, 就算你的公司是香港中央結算有限公司都沒有問題 (理論上). 有另一個 Datatype 跟 DECIMAL 很相似的就是 DOUBLE, 兩者的數值範圍都是一樣, 但是 DECIMAL 是一個固定數值 (Fixed), 而 DOUBLE 卻是一個浮點數值 (Float). 在記帳中少不免總會有加減乘除的動作, 而在追求精準平衡的時候, 你可不會想在報表中出現一些微少的差異, 重複當年 Microsoft Excel 2007 的 Bug 吧. 為了準確性, DECIMAL 基本是你唯一的選擇.

VARCHAR ( M char's ) - 字數限制從 0 到 65,535 個單位元字母或符號 (中文字是雙位元)
這個 VARCHAR 主要是用來作為 "文字欄", 例如表單明細, 名稱及其他混合資料等.

DATE ( 3 bytes ) - 日期範圍從 "1000-01-01" 到 "9999-12-31"
這個 DATE 主要是用來作為 "日期欄", 例如表單日期及結算日期等.

TIMESTAMP ( 4 bytes ) - 範圍從 '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
這個 TIMESTAMP 是一個系統自動生成的時間戳, 其一可以用來作為修復數據錯誤的依據, 另外還可以用作追蹤員工工作進度之用. (我是魔鬼...哈哈哈!)

以上六種 Datatype 基本上就是我那個自製記帳軟件的 Schema 的所用到的點線面定義, 如何組合它們就留待下一篇再說了.

PS. 寫這篇文章比寫書摘要累十倍也不止! 

沒有留言:

發佈留言