最新在開發中用到了EasyUI里面的Tree,通過API可以看到這個Tree的數據格式如下:
其中ID比較重要,API也說了,最開始我考慮到GUID比自增ID多占用了一些空間,所以采用的自增ID,測試數據庫結構如下:
其中,表TB_Menu中的MENU_ID為標識列,步長值為1,表TB_MenuGroup中的MENU_GROUP_ID也為標識列,步長值為1,Menu_Group_ID為主外鍵關系,我在頁面上需要將數據庫中所有的菜單都加載出來供用戶選擇,首先加入測試數據:
INSERT INTO TB_MENUGROUP VALUES('生產數據維護','測試1') INSERT INTO TB_MENUGROUP VALUES('工藝路線維護','測試2') INSERT INTO TB_MENUGROUP VALUES('系統報表','測試3') INSERT INTO TB_MENU VALUES('PMC計划',1,'Plan.aspx') INSERT INTO TB_MENU VALUES('工序維護',2,'RouteStep.aspx') INSERT INTO TB_MENU VALUES('不良報表',3,'Defects.aspx')
那么返回的結果如下:
SELECT A.MENU_GROUP_ID,A.MENU_GROUP_NAME,B.MENU_ID,B.MENU_NAME FROM TB_MENUGROUP A JOIN TB_MENU B ON A.MENU_GROUP_ID=B.MENU_GROUP_ID ORDER BY 1
先看一下程序里面頁面效果:
PS:截圖的時候之前的舊數據已經被清掉了,測試數據是后來增加進去的,只要能表達意思即可。
從上圖可以卡的出來每一個MenuGroup都是父節點,而Menu都是主節點,但是這個Tree里面每一個節點必須有一個不重復的ID,這下問題來了,MENU_GROUP_ID和MENU_ID都有1,2,3,4;那這樣就會重復,我在程序中增加父節點的數據格式如下:
json += "{\"id\":\"" + i.ToString() + "\",\"state\":\"closed\",\"iconCls\":\"icon-hq\",\"text\":\"" + ds.Tables[1].Rows[i]["MenuGroupName"].ToString() + "\","; //這里增加父節點
這是在一個循環里面,所以ID我用i.ToString()來實現,但是這樣仍然會重復,因為循環的i也是從0開始的阿拉伯數字,也會跟MENU_ID重復,導致的問題就是明明我這個id對應的是子節點,但是在json里面卻有一個相同的父節點,這樣就導致選取Tree節點的時候出問題(明明沒有選擇,可以系統自動給你選擇那些id重復的節點),重復的時候數據如下:
ID=4 的數據本來應該是FunctionID,但是在圖2上面顯示MENU_GROUP_ID也是4。
根據這個例子可以看的出來,GUID在某些場合確實實用一些,“唯一”是它最主要的優點,更改ID列的類型之后重新插入數據,內容如下圖:
試試GUID和IDENTITY各有各的好處,GUID只是比IDENTITY占空間一點,話說現在硬盤這么便宜,不在乎這點點空間吧,不如數據量太大到了以億為單位的時候,GUID的優勢還是很明顯的。