2012-04-26 30 views
1

SQL Server 2008で親子関係を構築しようとしていますが、動作させるのが難しいです。多くの多くの親子関係

  1. Preset(ルートレベルのノード)があり、PresetItems(子ノード)があります。

  2. AプリセットのみPresetItemsを含めることができますが、PresetItemsは、子ノードとして他のPresetItemsを含めることができます。

  3. 多くのプリセットは、彼らが含まれているPresetItemsに変化することに構築することができます。

  4. PresetItemsは異なるプリセット構成を構築するために、多くの異なるプリセットで再利用することができます。

これは、動的にレポートを作成する方法です。 Presetはレポートの名前です。 PresetItemは、レポートのさまざまな部分です。これらの部分(PresetItem)は、「Year to Date Graph」などのレポートのセクションのようになります。このPresetItemにはテキストの説明が含まれ、グラフを含む別のPresetItemをこのPresetItemセクションの子として追加できます。

このプロセスは、レポートのすべての部分が組み立てられるまで続きます。ここで

は例示である:

Client "A" Report (Preset 1) 
    -- Overview (PresetItem 1) - contains boilerplate and maybe some dynamic data 
    -- YTD Report (PresetItem 2) - contains boilerplate 
     -- YTD Graph (PresetItem 3) - contains a graph created dynamically from SQL Server data 
    -- Core References (PresetItem 4) - contains a table of dynamic data 
    -- Summary (PresetItem 5) - contains boilerplate 

Client "B" Report (Preset 2) 
    -- Overview (PresetItem 1) - contains boilerplate and maybe some dynamic data 
    -- Monthly Balance Sheet (PresetItem 8) - contains dynamic data 
    -- YTD Report (PresetItem 2) - contains boilerplate 
     -- YTD Graph (PresetItem 3) - contains a graph created dynamically from SQL Server data 
    -- Summary (PresetItem 5) - contains boilerplate 

...等...

あなたは、いくつかのPresetItemsは、多くの異なるレポートまたはプリセットに組み立てることができることに気づくでしょう。

この

は、私は私のデータベーステーブルを構築してきた方法であり、多対多のテーブルに2つの主キーがあるので、私は親子関係を作成することはできませんよ。

Preset Table 
-- Id (key) 
-- Name 

PresetItem Table 
-- Id (key) 
-- Name 
-- Description 
-- DataResource 
-- (other columns) 

PresetPresetItem (many-to-many table) 
-- PresetId (key) 
-- PresetItemId (key) 
-- ParentId 
-- SortOrder 

私は正しい結果を得るために私が探しているのですか? PresetItemIdとParentIdの間のPresetPresetItemテーブルに親子関係を作成することができません。なぜなら、他の主キー(PresetId)を省略していると言うからです。

私はそれがこれをやっている理由を理解して、私はちょうど今それを修正する方法を見つけ出すことはできません。私が間違ったことをしているなら、私に知らせてください。

何か助けていただければ幸いです。

ありがとうございました。

答えて

0

私はSQLサーバーに関する経験がありませんので、ここではデータベース設計に限定して説明します。

あなたが行く必要がある、これがあるようにそれは私に聞こえる:

PresetItemsは厳密に階層的で自分自身を参照することができた場合は、3番目のテーブルは不要です。この場合、PresetItemsに外部キーを返すだけです。そうでない場合は、多対多の関係をどのように実装するかについて考える必要があります。この仮定が間違っていたされている場合

しかし、その後、あなたは正しい軌道に乗って、おそらくです!このような

何か:

Presets 
------- 
presetId (PK) 

PresetItems 
----------- 
presetItemId (PK) 
presetIdFk (FK to Presets) 
presetItemIdFk (FK to PresetItems (self)) 

これは、多くのPresetItemsに1つのプリセットが可能になり、PresetItemsは、ツリーとして組織化されます。 PresetItemsは、階層データを表していない場合は

、あなたはこのような何かをする必要があります

Many-to-many self-referential table

+0

提案していただきありがとうございます。私はそれを打ち、何が起こるか見る。ところで、私はSQL Server 2008を使用しています。 – Kahanu

+0

実際にあなたの提案について考え直しても、この場合はうまくいかないようです。あなたの提案はプリセットに1つのPresetItemしか含まず、プリセットアイテムをいくつでも含む必要があります。私はいくつかの一時テーブルを作成し、私は必要な結果を返すSQL文を作成することができませんでした。 – Kahanu

+0

Aha。答えを修正する。 –

3

はこれを解決するにはいくつかの方法があります。

おそらく最も簡単な1は別のテーブルへの接続の各「種類」を分割することです:

enter image description here


また、あなたはまた、共通のテーブルからPresetItemを継承考えると可能性の上にグラフのエッジを実装すると、テーブル。ただし、あなたのニーズには柔軟性がないかもしれませんが、PresetPresetの子でも、Itemの子かもしれませんが、これはおそらくあなたが望むものではありません。

+0

これはほとんど私が思うところです。これは、「アイテム」がプリセットから独立している必要があるが、プリセットは他のプリセットの子であることができないという点では優れています。私はもう少しこれを調べる必要があると思う。提案していただきありがとうございます。 – Kahanu