1

SQL Server 2008 で親子関係を構築しようとしていますが、うまく機能しません。

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

  2. Preset には PresetItems のみを含めることができますが、PresetItems には子ノードとして他の PresetItems を含めることができます。

  3. 含まれる PresetItems が異なる多くのプリセットを作成できます。

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

これが使用される方法は、レポートを動的に作成することです。Preset はレポートの名前です。PresetItems は、レポートのさまざまな部分です。これらのパーツ (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 は、さまざまなレポートまたは Presets に組み立てることができます。

これは、データベース テーブルを構築した方法ですが、多対多テーブルに 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) を省略したと不平を言うためです。

なぜこれを行っているのかは理解していますが、今はそれを修正する方法がわかりません。私がこれについてすべて間違っている場合は、私に知らせてください。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

3

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

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

ここに画像の説明を入力


Presetまたは、共通テーブルからandを継承し、そのItemテーブルの上にグラフ エッジを実装することも検討できます。ただし、これはニーズに対して柔軟性が高すぎる可能性があります。別の子またはの子である可能性もありますが、これはおそらくあなたが望むものではありません。PresetPresetItem

于 2012-04-26T20:13:02.680 に答える
0

私は SQL サーバーの経験がないので、ここでの議論はデータベースの設計に限定しています。

これがあなたが行く必要がある場所のように私には思えます:

PresetItems が厳密に階層的な方法で自身を参照できる場合、3 番目のテーブルは不要です。この場合、PresetItems にそれ自体への外部キーを与えるだけです。そうでない場合は、多対多対自己の関係をどのように実装するかを考える必要があります。

しかし、この仮定が間違っていた場合、おそらく正しい方向に進んでいます!

このようなもの:

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

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

これにより、1 つの Preset を複数の PresetItems に割り当てることができ、PresetItems はツリーとして編成されます。

PresetItems が階層データを表していない場合は、次のようにする必要があります。

多対多の自己参照テーブル

于 2012-04-26T19:49:42.463 に答える