X-Spirit
Always Beyond the Time
BlogJava
|
首頁(yè)
|
發(fā)新隨筆
|
發(fā)新文章
|
聯(lián)系
|
聚合
|
管理
隨筆:91 文章:1 評(píng)論:65 引用:0
[導(dǎo)入][轉(zhuǎn)]采用左右值編碼來(lái)存儲(chǔ)無(wú)限分級(jí)樹(shù)形結(jié)構(gòu)的數(shù)據(jù)庫(kù)表設(shè)計(jì)2
采用左右值編碼的設(shè)計(jì)方案,在進(jìn)行類(lèi)別樹(shù)的遍歷時(shí),由于只需進(jìn)行
2次查詢(xún),消除了遞歸,再加上查詢(xún)條件都為數(shù)字比較,效率極高,類(lèi)別樹(shù)的記錄條目越多,執(zhí)行效率越高。看到這里,相信不少人對(duì)這種設(shè)計(jì)方案有所心動(dòng)了,下面讓我們接著看看如何在這種表結(jié)構(gòu)中實(shí)現(xiàn)插入、刪除、同層平移節(jié)點(diǎn)(變更同層節(jié)點(diǎn)排序)的功能。
?
假定我們要在節(jié)點(diǎn)“肉類(lèi)”下添加一個(gè)子節(jié)點(diǎn)“牛肉”,該樹(shù)將變成:
???????????????????????????????????? 1商品18+2
????????????????????? +--------------------------------------------+
??????????????? 2食品11+2????????????????????????????????? 12+2電器17+2
????????? +-----------------+??????????????????????????????????? +-------------------------+
??? 3肉類(lèi)6+2?? 7+2蔬菜類(lèi)10+2???????? 13+2電視機(jī)14+2??? 15+2電冰箱16+2
??? +-------------+
4豬肉5?
6牛肉7
? 8+2白菜9+2
?
看完上圖相應(yīng)節(jié)點(diǎn)左右值的變化后,相信大家都知道該如何寫(xiě)相應(yīng)的
sql腳本吧?下面我給出相對(duì)完整的插入子節(jié)點(diǎn)的存儲(chǔ)過(guò)程:
CREATE
?
PROCEDURE
?
[
dbo
]
.
[
AddSubNodeByNode
]
(
???
@type_id
?
int
,
???
@name
?
varchar
(
50
)
)
AS
declare
?
@rgt
?
int
if
?
exists
(
select
?
1
?
from
tree
where
type_id
=
@type_id
)
???
begin
??????
SET
XACT_ABORT
ON
??????
BEGIN
?
TRANSACTION
???????
select
?
@rgt
=
rgt
from
tree
where
type_id
=
@type_id
???????
update
tree
set
rgt
=
rgt
+
2
?
where
rgt
>=
@rgt
???????
update
tree
set
lft
=
lft
+
2
?
where
lft
>=
@rgt
???????
insert
?
into
tree (name,lft,rgt)
values
(
@name
,
@rgt
,
@rgt
+
1
)???
???????
COMMIT
?
TRANSACTION
??????
SET
XACT_ABORT
OFF
???
???
end
go
?
然后,我們刪除節(jié)點(diǎn)“電視機(jī)”,再來(lái)看看該樹(shù)會(huì)變成什么情況:
??????????????????????????????????????????? 1商品20-2
?????????????????????? +-----------------------------------+
??????????????? 2食品13??????????????????????????????? 14電器19-2
????????? +-----------------+???????????????
?????? 3肉類(lèi)8????????? 9蔬菜類(lèi)12????????????? 17-2電冰箱18-2
??? +----------+
4豬肉5? 6牛肉7? 10白菜11
?
相應(yīng)的存儲(chǔ)過(guò)程如下:
CREATE
?
PROCEDURE
?
[
dbo
]
.
[
DelNode
]
?
???
@type_id
?
int
AS
declare
?
@lft
?
int
declare
?
@rgt
?
int
if
?
exists
(
select
?
1
?
from
tree
where
type_id
=
@type_id
)
???
begin
??????
SET
XACT_ABORT
ON
??????
BEGIN
?
TRANSACTION
???????
select
?
@lft
=
lft,
@rgt
=
rgt
from
tree
where
type_id
=
@type_id
???????
delete
?
from
tree
where
lft
>=
@lft
?
and
rgt
<=
@rgt
???????
update
tree
set
lft
=
lft
-
(
@rgt
-
@lft
+
1
)
where
lft
>
@lft
???????
update
tree
set
rgt
=
rgt
-
(
@rgt
-
@lft
+
1
)
where
rgt
>
@rgt
???????
COMMIT
?
TRANSACTION
??????
SET
XACT_ABORT
OFF
???
End
?
注意:因?yàn)閯h除某個(gè)節(jié)點(diǎn)會(huì)同時(shí)刪除該節(jié)點(diǎn)的所有子孫節(jié)點(diǎn),而這些被刪除的節(jié)點(diǎn)的個(gè)數(shù)為:(被刪節(jié)點(diǎn)的右值-被刪節(jié)點(diǎn)的左值+1)/2,而任何一個(gè)節(jié)點(diǎn)同時(shí)具有唯一的左值和唯一的右值,故刪除作廢節(jié)點(diǎn)后,其他相應(yīng)節(jié)點(diǎn)的左、右值需要調(diào)整的幅度應(yīng)為:減少(被刪節(jié)點(diǎn)的右值-被刪節(jié)點(diǎn)的左值+1)。
?
? 最后,讓我們看看平移節(jié)點(diǎn)“電器”,將其和其所有子孫節(jié)點(diǎn)移動(dòng)到節(jié)點(diǎn)“食品”之前后,該樹(shù)會(huì)變成什么情況:
?
1商品18
+-----------------------------------+
??????????????? 14-12電器17-12????????????????????? 2+4食品13+4
?????????????????????????????????????????????????????????????? +----------------------+???????????????
???????????? 15-12電冰箱16-12????? 3+4肉類(lèi)8+4????? 9+4蔬菜類(lèi)12+4???????
??????????????????????????????????????????????? +-------------------+
????????????????????????????????????? 4+4豬肉5+4???? 6+4牛肉7+4 10+4白菜11+4
?
大家仔細(xì)觀(guān)察一下交換后同層
2個(gè)節(jié)點(diǎn)和其所有子孫節(jié)點(diǎn)左右值的變化,可以發(fā)現(xiàn)一個(gè)明顯的規(guī)律,那就是,節(jié)點(diǎn)“電器”及其所有子孫節(jié)點(diǎn)的左右值均減少12,而節(jié)點(diǎn)“食品”及其所有子孫節(jié)點(diǎn)的左右值均增加4。而節(jié)點(diǎn)“電器”+其子孫節(jié)點(diǎn)的數(shù)量為2,節(jié)點(diǎn)“食品”+其子孫節(jié)點(diǎn)的數(shù)量為6,這其中有什么聯(lián)系嗎?還記得我在刪除節(jié)點(diǎn)的存儲(chǔ)過(guò)程后面的注釋嗎?
任何一個(gè)節(jié)點(diǎn)同時(shí)具有唯一的左值和唯一的右值。讓我們把節(jié)點(diǎn)數(shù)量*2,正好和節(jié)點(diǎn)左右值需要調(diào)整的幅度相等。由此規(guī)律,我們可以編寫(xiě)出類(lèi)似下面的存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)節(jié)點(diǎn)同層前移的功能:
CREATE
?
PROCEDURE
?
[
dbo
]
.
[
MoveNodeUp
]
?
???
@type_id
?
int
AS
declare
?
@lft
?
int
declare
?
@rgt
?
int
declare
?
@layer
?
int
if
?
exists
(
select
?
1
?
from
tree
where
type_id
=
@type_id
)
???
begin
??????
SET
XACT_ABORT
ON
??????
BEGIN
?
TRANSACTION
???????
select
?
@lft
=
lft,
@rgt
=
rgt,
@layer
=
layer
from
TreeView
where
type_id
=
@type_id
???????
if
?
exists
(
select
?
*
?
from
TreeView
where
rgt
=
@lft
-
1
?
and
layer
=
@layer
)
??????????
begin
??????????????
declare
?
@brother_lft
?
int
??????????????
declare
?
@brother_rgt
?
int
??????????????
select
?
@brother_lft
=
lft,
@brother_rgt
=
rgt
from
TreeView
where
rgt
=
@lft
-
1
?
and
layer
=
@layer
??????????????
update
tree
set
lft
=
lft
-
(
@brother_rgt
-
@brother_lft
+
1
)
where
lft
>=
@lft
?
and
rgt
<=
@rgt
??????????????
update
tree
set
lft
=
lft
+
(
@rgt
-
@lft
+
1
)
where
lft
>=
@brother_lft
?
and
rgt
<=
@brother_rgt
??????????????
update
tree
set
rgt
=
rgt
-
(
@brother_rgt
-
@brother_lft
+
1
)
where
rgt
>
@brother_rgt
?
and
rgt
<=
@rgt
??????????????
update
tree
set
rgt
=
rgt
+
(
@rgt
-
@lft
+
1
)
where
lft
>=
@brother_lft
+
(
@rgt
-
@lft
+
1
)
and
rgt
<=
@brother_rgt
??????????
end
???????
COMMIT
?
TRANSACTION
??????
SET
XACT_ABORT
OFF
???
???
end
?
注意:節(jié)點(diǎn)的同層平移可以采用臨時(shí)表來(lái)做中介,降低代碼的復(fù)雜度。不用臨時(shí)表來(lái)處理也行,但是
update語(yǔ)句順序一定要考慮周詳。否則,一旦出現(xiàn)bug,對(duì)整個(gè)類(lèi)別表的破壞是驚人的,強(qiáng)烈推薦在做上述工作前對(duì)類(lèi)別表進(jìn)行完整備份。
?
同層下移的存儲(chǔ)過(guò)程和同層上移類(lèi)似,有興趣的朋友可以自己動(dòng)手編寫(xiě)體味一下其中的細(xì)節(jié),我就不在這里列出來(lái)了。
?
最后,我對(duì)上面這種左右值編碼實(shí)現(xiàn)無(wú)限分級(jí)類(lèi)別樹(shù)的方案做一個(gè)總結(jié):
優(yōu)點(diǎn):在消除遞歸的前提下實(shí)現(xiàn)了無(wú)限分級(jí),而且查詢(xún)條件是基于整形數(shù)字比較的,效率很高。可以進(jìn)行先序列表,添加,修改,刪除,同層平移等常規(guī)操作,基本滿(mǎn)足需求。
缺點(diǎn):由于這種左右值編碼的方式和常見(jiàn)的阿拉伯?dāng)?shù)字直觀(guān)排序不同,再加上節(jié)點(diǎn)在樹(shù)中的層次,順序不是直觀(guān)顯示出來(lái),而必須通過(guò)簡(jiǎn)單的公式計(jì)算后得到,需要花費(fèi)一定的時(shí)間對(duì)其數(shù)學(xué)模型進(jìn)行深入理解。而且,采用該方案編寫(xiě)相關(guān)存儲(chǔ)過(guò)程,新增,刪除,同層平移節(jié)點(diǎn)需要對(duì)整個(gè)樹(shù)進(jìn)行查詢(xún)修改,由此導(dǎo)致的代碼復(fù)雜度,耦合度較高,修改維護(hù)的風(fēng)險(xiǎn)較高。
?
文章來(lái)源:
http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!368.entry
發(fā)表于 2007-12-18 20:02
X-Spirit
閱讀(261)
評(píng)論(0)
編輯
收藏
新用戶(hù)注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶(hù)
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
<
2007年12月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
常用鏈接
我的隨筆
我的文章
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(6)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類(lèi)
(28)
Big Data
(rss)
Cloud
(rss)
Java EE
(rss)
Java FX
(rss)
Java SE(9)
(rss)
Java 輕量級(jí)企業(yè)開(kāi)發(fā)(5)
(rss)
Linux(3)
(rss)
MySQL
(rss)
NetBeans(1)
(rss)
Node.js
(rss)
NoSQL
(rss)
Oracle(3)
(rss)
前端技術(shù)
(rss)
開(kāi)源協(xié)議(1)
(rss)
思維模式
(rss)
悟(1)
(rss)
技術(shù)之外(5)
(rss)
敏捷開(kāi)發(fā)
(rss)
時(shí)間管理
(rss)
隨筆檔案
(90)
2014年9月 (1)
2014年3月 (1)
2014年2月 (1)
2014年1月 (1)
2013年2月 (1)
2012年11月 (1)
2012年10月 (1)
2012年3月 (1)
2012年2月 (1)
2011年2月 (1)
2010年4月 (6)
2010年3月 (4)
2010年1月 (2)
2009年11月 (1)
2009年8月 (1)
2009年7月 (1)
2009年6月 (2)
2009年5月 (1)
2009年4月 (13)
2009年3月 (1)
2009年2月 (1)
2009年1月 (2)
2008年12月 (3)
2008年11月 (1)
2008年10月 (1)
2008年9月 (3)
2008年5月 (1)
2008年4月 (9)
2008年3月 (3)
2008年1月 (1)
2007年12月 (4)
2007年10月 (2)
2007年9月 (6)
2007年8月 (9)
2007年7月 (1)
2007年4月 (1)
文章分類(lèi)
(1)
My Voice(1)
(rss)
文章檔案
(1)
2009年12月 (1)
收藏夾
(4)
別人的學(xué)習(xí)筆記(4)
(rss)
牛人牛博
DaoRu的Blog
(rss)
愛(ài)折騰的道儒
Doug Lea's Home Page
Doug Lea's Home Page
jolestar
老王的博客
Tim Yang
(rss)
后端技術(shù)
Yang_net
(rss)
靠譜IT帥哥
搖擺巴赫@blog.sina
源碼控
搖擺巴赫@javaeye
源碼控
文初的一畝三分地
淘寶放翁
淘寶核心團(tuán)隊(duì)
淘寶核心團(tuán)隊(duì)
福林雨
(rss)
福林的博客
那誰(shuí)的BLOG
那誰(shuí)的BLOG
酷站
ImportNew
學(xué)習(xí)新知、發(fā)現(xiàn)新朋友
InfoQ中文站
InfoQ中文站
InfoQ英文站
InfoQ英文站
Java Code Geeks
A website for Java Geeks
并發(fā)編程網(wǎng)
并發(fā)編程網(wǎng)
開(kāi)源中國(guó)
OSCHINA
百度技術(shù)沙龍
百度技術(shù)沙龍
酷殼
(rss)
酷殼
最新隨筆
1.?【Math's History】什么是羅素悖論
2.?【Effective】IntelliJ IDEA MAC IDE config files
3.?5 Ways To Burn Out Programming
4.?【Efficiency】快速配置ubuntu桌面環(huán)境之Java環(huán)境配置[全軟件源安裝]
5.?【Efficiency】MAC下使用設(shè)定可以從mission control中啟動(dòng)的eclipse.app。
6.?【Effective】如何遷移git倉(cāng)庫(kù)
7.?【轉(zhuǎn)】閱讀我們的學(xué)科——計(jì)算機(jī)專(zhuān)業(yè)學(xué)習(xí)淺談
8.?【Tech Details】【轉(zhuǎn)】有關(guān)Java SPI機(jī)制
9.?【Efficiency】 監(jiān)控 Linux 性能的 18 個(gè)命令行工具
10.?【Effective】Logging最佳實(shí)踐
搜索
最新評(píng)論
1.?re: Java 多線(xiàn)程同步問(wèn)題的探究(三、Lock來(lái)了,大家都讓開(kāi)【1. 認(rèn)識(shí)重入鎖】)
上班
--地點(diǎn)
2.?re: 【轉(zhuǎn)】閱讀我們的學(xué)科——計(jì)算機(jī)專(zhuān)業(yè)學(xué)習(xí)淺談
好文!
--何楊
3.?re: [導(dǎo)入][轉(zhuǎn)]重復(fù)提交、重復(fù)刷新、防止后退的問(wèn)題以及處理方式
是多少
--乒乓、
4.?......
....
--..
5.?re: Java多線(xiàn)程同步問(wèn)題的探究(一、線(xiàn)程的先來(lái)后到)
多線(xiàn)程這塊一直是軟肋,學(xué)習(xí)一下,呵呵
--FlyingFish
閱讀排行榜
1.?Java 多線(xiàn)程同步問(wèn)題的探究(三、Lock來(lái)了,大家都讓開(kāi)【1. 認(rèn)識(shí)重入鎖】)(9054)
2.?Java 多線(xiàn)程同步問(wèn)題的探究(五、你有我有全都有—— ThreadLocal如何解決并發(fā)安全性?)【更新重要補(bǔ)疑】(8411)
3.?Java 多線(xiàn)程同步問(wèn)題的探究(二、給我一把鎖,我能創(chuàng)造一個(gè)規(guī)矩)(7440)
4.?Java 多線(xiàn)程同步問(wèn)題的探究(四、協(xié)作,互斥下的協(xié)作——Java多線(xiàn)程協(xié)作(wait、notify、notifyAll))(7252)
5.?Java多線(xiàn)程同步問(wèn)題的探究(一、線(xiàn)程的先來(lái)后到)(7103)
評(píng)論排行榜
1.?Java 多線(xiàn)程同步問(wèn)題的探究(五、你有我有全都有—— ThreadLocal如何解決并發(fā)安全性?)【更新重要補(bǔ)疑】(15)
2.?Java 多線(xiàn)程同步問(wèn)題的探究(三、Lock來(lái)了,大家都讓開(kāi)【1. 認(rèn)識(shí)重入鎖】)(10)
3.?Java 多線(xiàn)程同步問(wèn)題的探究(二、給我一把鎖,我能創(chuàng)造一個(gè)規(guī)矩)(9)
4.?Java 多線(xiàn)程同步問(wèn)題的探究(四、協(xié)作,互斥下的協(xié)作——Java多線(xiàn)程協(xié)作(wait、notify、notifyAll))(9)
5.?Java多線(xiàn)程同步問(wèn)題的探究(一、線(xiàn)程的先來(lái)后到)(8)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 X-Spirit
主站蜘蛛池模板:
亚洲一区二区三区夜色
|
四虎成人精品一区二区免费网站
|
又粗又长又爽又长黄免费视频
|
国产亚洲一卡2卡3卡4卡新区
|
女人毛片a级大学毛片免费
|
日本免费xxxx
|
久久久久久免费视频
|
毛片A级毛片免费播放
|
成人毛片18女人毛片免费96
|
精品一区二区三区免费
|
国内精品免费视频精选在线观看
|
三上悠亚在线观看免费
|
久久精品中文字幕免费
|
十九岁在线观看免费完整版电影
|
久久久99精品免费观看
|
国产成人精品免费视频网页大全
|
黄页网站在线观看免费高清
|
在线观看免费污视频
|
国产伦精品一区二区三区免费迷
|
免费在线观看黄网站
|
国产亚洲美日韩AV中文字幕无码成人
|
亚洲男人的天堂网站
|
羞羞漫画登录页面免费
|
一级日本高清视频免费观看
|
中文字幕av无码不卡免费
|
久久午夜无码免费
|
91免费精品国自产拍在线不卡
|
午夜一级免费视频
|
亚洲 无码 在线 专区
|
亚洲区小说区激情区图片区
|
亚洲经典在线观看
|
亚洲七久久之综合七久久
|
一级特黄aaa大片免费看
|
久久成人免费大片
|
无码免费午夜福利片在线
|
免费a在线观看播放
|
国产亚洲高清不卡在线观看
|
亚洲国产成人久久综合一区
|
亚洲精品乱码久久久久久V
|
igao激情在线视频免费
|
亚洲精品无码久久久久APP
|