- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務(wù)經(jīng)營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標(biāo)記
- 域名注冊服務(wù)機構(gòu)許可:滇D3-20230001
- 代理域名注冊服務(wù)機構(gòu):新網(wǎng)數(shù)碼
SQL Server 2008數(shù)據(jù)庫中的新數(shù)據(jù)類型
對于關(guān)系型數(shù)據(jù)庫來說,表現(xiàn)樹狀的層次構(gòu)始終是一個問題。微軟在Sql Server 2005中首次嘗試了解決這個問題,那就是被稱之為通用數(shù)據(jù)表表達式(Common Table Expressions,CTE)的實現(xiàn)方式。
盡管CTE在現(xiàn)有的數(shù)據(jù)庫架構(gòu)中運行良好,微軟找到了一種將此類層次結(jié)構(gòu)作為頭等概念來使用的方式。因此為了實現(xiàn)這種效果,他們在SQL Server 2008中提出了一種“HierarchId”數(shù)據(jù)類型。
在傳統(tǒng)的層次結(jié)構(gòu)中,一條記錄僅僅儲存了一個指向它父記錄的引用,這使得一條記錄能夠獲得它在層次結(jié)構(gòu)中的相對位置,而不是絕對位置。改變某條記錄的父數(shù)據(jù)行?用是一個原子更新操作,它不會影響到該記錄的任何子記錄。
一個HierarchyId類型的字段儲存了記錄在層次結(jié)構(gòu)中的準(zhǔn)確位置。Denny Cherry提供了一個例子,其中展示了0x、0x58以及0x5AC0三個值,它們的字符串表現(xiàn)形式分別為“/”,“/1/”和“/1/1/”。這就引發(fā)了有關(guān)一致性和性能方面的問題,尤其是父記錄被改變的時候。Ravi S.Maniam建議在改變父記錄操作不頻繁的情況下使用這種設(shè)計方式。
與HierarchyId類型同時出現(xiàn)的還有一系列函數(shù)。GetAncestor和GetDescendant方法可以用來遍歷樹。 ToString和Parse方法用于HierarchyId類型二進制與字符串表現(xiàn)形式之前的轉(zhuǎn)換。有些古怪的是,隨之而來的還有用于支持 BinaryReader與BinaryWriter的一些方法。
再來回頭看看GetDescendant,這是一個有些古怪的方法。它實際上不返回那些子記錄,而是返回那些潛在的子節(jié)點的位置。向樹中插入一個新的記錄時,我們必需調(diào)用GetDescendant方法來獲得指定父記錄的最后一個子節(jié)點的位置,然后才能獲得緊跟著該位置之后的空隙。
迄今為止還沒有使用T-SQL來獲得樹狀結(jié)構(gòu)的合適示例。事實上,與它有關(guān)的所有東西都更像是一些命令,而不是基于基于集合的操作。
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP