28

SQL Server 2008の新しいHierarchyIDタイプを使用して、小さなWikiアプリケーションのページリレーションを処理したいと思いました。ただし、アカウントごとのすべての主要な記事/ページがルートノードになるため、複数のルートノードが必要になります。

私が読んだことから、HierarchyIDタイプは列ごとに1つのルートノードしか許可しませんこれは正しいですか?複数のルートノードを有効にする方法はありますか?

4

6 に答える 6

31

私はいくつかのテストを行ってきましたが、ルートの 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 番目のレベルをルートと見なす限り、複数のルートを持つことができます。

于 2009-09-03T06:19:30.733 に答える
11

一意のルート ノードを作成するために行うことは、テーブルの 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 
于 2010-09-07T20:09:25.293 に答える
2

「表示されない」ルートを 1 つだけ作成し、すべての主要記事をレベル 1 にすることはできませんか?

于 2009-08-30T19:40:46.160 に答える