樹形結構的排序在中國特點下十分廣泛也很是重要,例如常說的五大班子,黨委>人大>政府>政協>紀委,每一個班子下還有部門,崗位,人員,最終排列的順序一般須要按權力大小、重要性等進行排列,順序排列很差但是重大的罪過,領導很生氣,後果很嚴重。這種排序方式本質上就是典型的樹形結構深度排序,但在數據庫中很難直接經過SQL語句簡單高效地進行處理,更不用說還要支持不一樣類型數據庫了。html
當前解決此類問題,主要有兩種方法。數據庫
1. 排序碼方式併發
2. 左右值編碼ide
本文介紹的設計方式則是前文介紹的權限模型中組織機構樹所採用的排序碼+排序值方式:http://www.cnblogs.com/gyche/p/3670179.html編碼
排序碼+排序值spa
1)數據庫表結構的設計中增長兩個排序字段,其中一個字段存儲排序碼,類型爲字符串,另外一個字段存儲排序值,類型爲浮點型。排序碼最終參與SQL語句的查詢和排序結果的生成;排序值爲輔助字段,主要用於同層次節點間排序順序的比較、排序順序的調整修改等並最終根據其值格式化生成排序碼,該字段並不直接參與SQL語句的查詢和排序,主要是在對排序順序進行調整時很是有用。.net
2)新增節點時,查找要插入節點所在的父節點的排序碼和父節點下全部直接子節點的最大排序值並加1得出實際排序值(此處假想添加的節點老是排在同層節點的最後),根據該排序值格式化出固定長度的排序碼並和父節點的排序碼組合,中間使用「/」字符隔開,生成實際的排序碼。例如,父結點的排序碼爲「/000000000000000000129.」,當前計算出的排序值爲320,對應的排序值則爲:「000000000000000000320.」,則最終的排序碼就應該是「/000000000000000000129./000000000000000000320.」。設計
此處須要注意的是,排序值爲負數的狀況下,須要使用浮點值所容許的最小值-去排序值來格式化生成排序碼(由於最終排序使用的是字符串比較),不然排序值爲負數的狀況下使用字符串比較進行排序就會出現問題,生成排序碼的程序代碼以下:orm
/// <summary> /// 格式化生成排序碼 /// </summary> /// <param name="parentOrderCode">父排序碼</param> /// <param name="displayOrder">排序值</param> /// <returns>生成的排序碼</returns> internal override string FormatOrderCode(string parentOrderCode, decimal displayOrder) { if (displayOrder < decimal.Zero) { displayOrder = decimal.MinValue - displayOrder; } //可根據須要調整生成排序碼的格式和長度 var orderCode = string.Format("{0:000000000000000000000.000000000000000000}", displayOrder).Replace('-', '#').TrimEnd(new[] { '0' }); return string.Format("{0}/{1}", parentOrderCode, orderCode); ; }
附 - 排序在線演示:http://pjdemo.yellbuy.com/htm