2009-04-23 12 views
0

報告階層を表すために複数のテーブルを使用するアプリケーションのかなりの怪物を見ていますが、これらのテーブルのeacvhは同じです。階層の最下部にあるテーブルには、その上にロールアップテーブルのParentIDを持つレコードが多くあります。最終的には、すべてがトップロールアップテーブルに1つだけ追加されます。多重テーブルの階層構造を参照してください

ハードコーディングされたジョインとテーブル名を持つコードブロックの場合、私は狂気に悩まされています。そして、各行にlevelIDを持つ単一のテーブルを使用しないという理由で、各レベルごとに1つの表、これらすべてのレベル、または同じ表の少なくともいくつかのビューの代わりに使用できます。後者は、データベースがエイリアスサブクエリAFAIKを許可しないMSAccessで使用するように設計されているためです。

答えて

4

テーブルのセマンティクスは同じですか、あるいはその形式だけですか?テーブルがフォームとセマンティクスの両方で同一であれば、単一のテーブルソリューションがおそらくはるかに優れていますが、確かにあなたのケースについては十分にわかりません。

SQLテーブル内の階層を表すことは非常に難しいことです。幸いにも、レポート階層は一般に十分小さく、さまざまなテクニックが機能するように十分に安定しています。

最も簡単な手法は、「隣接リスト」モデルという名前です。このモデルでは、2つの列があり、その一方が他方を参照しています。 MyTable(ID、ParentID)と呼ぶことにします。実際のケースでは、Mytableには他の列があります。 ParentIDは同じテーブルの別の行のIDを参照します。これは実装が簡単で、簡単に更新できます。ロールアップを行うことは苦痛である可能性があります。

もう1つの手法は、ネストされたセットという名前になります。 MyTable(ID、lft、rgt、Level)と呼んでください。 (レベルは冗長であり、しばしば省略される)。ここでは、lgtとrgtが問題のノードのすべての祖先のlftとrgtの内側にネストされているため、行が階層に収まる場所を示す2つの列(lftとrgt)があります。この手法は更新が難しい。ロールアップを実行したり、サブツリー、祖先パス、その他多くの種類のクエリを見つけるのは簡単です。

「階層を平坦化する」3番目の方法です。この手法では、階層の各レベルに独自の名前付き列があり、各行は階層の頂点まですべての祖先を表示します。私たちはMyTable(ID、部門、部、グループ、チーム)を持っています。部門、部門、グループ、およびチームはすべて階層のレベルです。これは、ポイントアンドクリックドリルダウンインターフェイスを使用してデータにアクセスするユーザーにとっては、列名が適切に選択されていれば、習得するものがないため、最終的には簡単です。各レベルの名前が必要です。無限レベルの階層にはうまく適応しません。それは多くの冗長性を持っています。一般的には、階層化されたリストを恒久リスト形式またはネストされたセット形式で格納するテーブルから、フラット化されたハイエアキーが自動的に生成されます。

これらのいずれかは、階層内のすべてのレベルのテーブルを分離するのに適しています。

+0

+1リレーショナルデータベースにおける階層問題の良好なカバレッジ。私はまた、話題の深いカバレッジのために、通常、人々をジョー・セルコの本の本を指します。ちょうど "ジョーCelko階層"のAmazonの検索を行います。 –

-2

優れたソリューションが既にここで提案されています。私はハイパーグラフのような階層的なデータベースを使うために1つを追加します。

関連する問題