2014年12月20日 星期六

合久必分,分久必合

很久以前用DBASE資料庫的時候,當時一個檔案有2M的限制,所以考量到資料量的關係,於是把筆數多的資料,區分為不同類型的檔案。例如料品基本檔就依型態,原料叫ITEM1,一般物料叫ITEM2,半成品叫ITEM3,成品叫ITEM4等等。這樣就可以減少單一TABLE筆數過大的問題。

不過到了SQL,資料庫的容量大大提昇了,用WHERE條件來區分料品型態其實是一件很容易的事。於是為了減少程式碼,就把先前的檔案合併成一個,用一個分類碼來做區分,這樣原先要個別寫四隻程式維護,變成只要寫一隻就行了。

這種方式行之有年,大家也覺得很正常,資料庫大真的很方便,程式不用再像以前一樣考慮TABLE合併的問題。不過筆者最近碰到一個案例,就是前面說的料品檔一分為四的情形。可能是從舊程式資料轉上來,因為資料的關係,沒辦法合併到相同的TABLE,這下要查詢挑選全部的資料就麻煩了。

事實上在很多情況也必須把不同TABLE的資料合併讓操作人員挑選,例如付款時,付款的對象可能是廠商,但如果客戶也會有付款的情形呢?當然有人會在廠商檔建立客戶編號,當作付款對象,不過如果員工也會有付款情形呢?好像這樣加也不是好方法。

這是用SQL資料庫提供的VIEW就很方便了,利用UNION把先前分開的TABLE整合在一起,就可以讓操作人員挑選了
以下就是把客戶檔 G_CUST、廠商檔 P_VEND 和員工檔 PUB_EMP 建立成 v_PUB_ID_HQ

Create View vPUB_ID_HQ AS
Select  '1' AS FG_OBJECT,ID_CUST AS ID_HQ,NM_CS,NM_CONTACT,NN_TEL,NN_FAX,AR_MAIL FROM G_CUST
UNION
Select  '2' AS FG_OBJECT,ID_VEND AS ID_HQ,NM_CS,NM_CONTACT,NN_TEL,NN_FAX,AR_MAIL FROM P_VEND
UNION
Select  '3' AS FG_OBJECT,ID_EMP AS ID_HQ,NM_EMP AS NM_CS,NM_CONTACT,NN_TEL,NULL AS NN_FAX,AR_EMAIL AS AR_MAIL  FROM PUB_EMP

這樣以後 SLECT * FROM v_PUB_ID_HQ,就會出現合併的資料,讓使用者挑選了

用WHERE條件把大資料區分成需要的小資料,用UNION把不同TABLE的資料合併成大資料。二種方式讓你設計的資料庫結構更有彈性。