2011-01-08 7 views
0

日々の測定データを記録し報告するシステムを設計しています。データは、カテゴリ識別子、日付/時刻、測定データ(浮動小数点または整数のいずれかで最大500個あります)から構成されます。
カテゴリはツリー構造として視覚化され、データはノードとリーフに関連付けられます。
生データは次の形式でCSVとして来:フラットテーブルから隣接関係リストへのプロジェクトデータ

1/6/2001 15:55, /Node1/Node2/Node3, 121, 34, 452, 651, 167 
1/6/2001 15:55, /Node1/Node2/Node3/LeafA, 12, 34, 45, 65, 67 
1/6/2001 15:55, /Node1/Node4/Node5/LeafB, 21, 32, 43, 54, 65 

私は、ツリー構造のために(Database Structure for Tree Data Structureを参照)隣接リストを使用して計画しています。また、測定データと日付/時刻の2つ目のテーブルを用意する予定です。このようにして、ツリー構造が最初に生成されると、それは測定データテーブルによって繰り返し参照されることができる。また、Adjacency Listテーブルを小さくすると、システムがはるかに読みやすくなります:)。以下のカテゴリテーブルでは、名前はノードまたはリーフ名(たとえばノード1またはリーフA)であり、フルネームは全体の分岐パス(たとえばノード1 /ノード2 /ノード3 /リーフA)である。どちらも必要なのか分かりませんが、必要に応じてFullNameを再作成する必要がないので便利です。システムにデータをロードする

CREATE TABLE [dbo].[Category](
    [CatId] [int] IDENTITY(1,1) NOT NULL, 
    [ParentCatId] [int] NULL, 
    [Name] [nvarchar](30) NOT NULL, 
    [FullName] [nvarchar](MAX) NOT NULL 
CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED 
(
    [CatId] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
CREATE TABLE [dbo].[MeasurementData](
    [CatId] [int] NOT NULL, 
    [DateCollected] [datetime] NOT NULL, 
    [foo] [int] NOT NULL, 
    [bar] [float] NOT NULL, 
) ON [PRIMARY] 
GO 
ALTER TABLE [dbo].[MeasurementData] WITH CHECK ADD CONSTRAINT [FK_ MeasurementData _Category] FOREIGN KEY([CatId]) 
REFERENCES [dbo].[Category] ([CatId]) 
GO 
ALTER TABLE [dbo].[MeasurementData] CHECK CONSTRAINT [FK_ MeasurementData _Category] 
GO 

、私は(SQL Server 2008のに)平らなテーブルにCSVをロードして、階層的なテーブル構造に平らなテーブルを投影するBCPを使用して考えていました。
Q1:T-SQLまたはC#(SQL Server以外のC#アプリケーション)を使用してこの投影を試す必要がありますか?
Q2:上記のカテゴリ識別子を指定して、適切なリーフをすばやく見つけ出す(または作成して返す)既存のアルゴリズムを持っているのは誰ですか?

FYI、再帰的なクエリ構文の周りに、WITHキーワードとそれに続く共通のテーブル式を使用して、私は頭を回しています。
https://stackoverflow.com/questions/tagged/common-table-expression
http://media.pragprog.com/titles/bksqla/trees.pdf

あなたのテーブル構造が少しあやふやかもしれ事前

答えて

1

に感謝します。

入力データの例は、すべてのメジャーセットがノードリスト全体に適用されることを示しています。これが真である場合は、方が良いが、このような何かを取得し、ノードリストの文字列をハッシュ化されている:

TABLE: Category 

HashId NodeList 
====== =================== 
289383 node1\node2\.... 
139829 node6\node7\....

MeasurementDataからの外部キーがHashIdされるようになりました。

これは、Q1:データを渡しながらC#でハッシュを生成し、カテゴリテーブルとMeasurementDataテーブルのBCP準備が整った2つの出力ファイルを生成します。

これはある種のデータウェアハウスなので、他の方法で取得するために最適化されたデータの他のコピーを生成するのを恐れないでください。したがって、カテゴリの2番目の表現をCategoryDe​​tailsテーブルこのような何か:http://database-programmer.blogspot.com/2010/11/recursive-queries-with-common-table.html

:共通テーブル式の使用方法については、私も彼らの周り私の頭をラップするいくつかのトラブルがあったが、私はそれを把握たら、私はブログのエントリを書いた
TABLE CategoryDetails 

HashId NodeName ParentNodeName 
====== ========= ================= 
289383 node1 
289383 node2  node1 
etc, etc,