SQL Server 2008の新しいHierarchyIDタイプを使用して、小さなWikiアプリケーションのページリレーションを処理したいと思いました。ただし、アカウントごとのすべての主要な記事/ページがルートノードになるため、複数のルートノードが必要になります。
私が読んだことから、HierarchyIDタイプは列ごとに1つのルートノードしか許可しませんこれは正しいですか?複数のルートノードを有効にする方法はありますか?
SQL Server 2008の新しいHierarchyIDタイプを使用して、小さなWikiアプリケーションのページリレーションを処理したいと思いました。ただし、アカウントごとのすべての主要な記事/ページがルートノードになるため、複数のルートノードが必要になります。
私が読んだことから、HierarchyIDタイプは列ごとに1つのルートノードしか許可しませんこれは正しいですか?複数のルートノードを有効にする方法はありますか?
私はいくつかのテストを行ってきましたが、ルートの hierarchyid を持つレコードは必要ないようです。
たとえば、通常は 1 つのルート ノード (レベル 1) と複数の子ノードを作成しますが、ルート ノードをスキップして、ルート レコードを持たず、レベル 2 から始まるレコードのみを作成することもできます。
//table schema
CREATE TABLE [Entity](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL
[Hierarchy] [hierarchyid] NOT NULL,
CONSTRAINT [PK_Entity] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
//Insert first 'root', which is technicall a child without a parent
INSERT INTO [Entity]
([Name]
,[Description]
,[Hierarchy])
VALUES
('Root A'
,hierarchyid::GetRoot().GetDescendant(NULL,NULL))
//Create the second 'root'
INSERT INTO [Entity]
([Name]
,[Hierarchy])
VALUES
('Root B'
,hierarchyid::GetRoot().GetDescendant((select MAX(hierarchy) from entity where hierarchy.GetAncestor(1) = hierarchyid::GetRoot()),NULL))
テーブルからすべての行を選択すると、次のように表示されます。
SELECT [ID]
,[Name]
,[Hierarchy],
[Hierarchy].ToString()
FROM [Entity]
ID 名 階層 (列名なし)
1 ルート A 0x58 /1/
2 ルート B 0x68 /2/
これが推奨される方法かどうかはわかりませんが、概念的には、ツリーの 2 番目のレベルをルートと見なす限り、複数のルートを持つことができます。
一意のルート ノードを作成するために行うことは、テーブルの PrimaryKey を目的のアンカー レコードの HierarchyId としてキャストすることです。
ArticleID | を持つ仮のテーブルが与えられた場合 ArticleID_Parent | 階層、すべての「ルート」を微調整して、このように一意にすることができます。
UPDATE [Article]
SET Hierarchy=CAST('/'+CAST([ArticleID] as varchar(30))+'/' AS hierarchyid)
WHERE [ArticleID_Parent]=0
.. 次に、特定のルートの「ブランチ」を取得します。
SELECT * FROM [Article]
WHERE Article.Hierarchy.IsDescendantOf((SELECT Hierarchy FROM Article WHERE ArticleID=XXXX)) = 1
「表示されない」ルートを 1 つだけ作成し、すべての主要記事をレベル 1 にすることはできませんか?