私はキャリアの中でこの問題に数回遭遇しましたが、解決策に満足したことは一度もありませんでした。ASP.NetMVC、C#、SQLServer2008で行っているプロジェクトで再び問題が発生しました。
私がPersonタイプ(クラス)を持っていると想像してください。私はさらに、人を拡張するタイプの母と父を持っています。父と母は非常に似ています。どちらも「子供」と呼ばれるプロパティを持っています。これは、Personタイプのコレクションです。「人」は、基本のPersonクラス、Motherクラス、またはFatherクラスのいずれかで表すことができます。この例から、継承(is-a)と関連付け(has-a)の両方の関係が進行していることがわかります。
これらのOOタイプを使用して、SQLServerに家系図を作成して保存したいと思います。人、母、父の3つのテーブルが欲しいと思います。すべてのオブジェクトには、Personのエントリがあり、必要に応じて、MotherまたはFatherにエントリがあります(PersonとのFK関係があります)。さらに、母の記録と子の記録の間の関係を保存するために、父と同じように、いくつかの横断歩道のテーブルが必要になります。
これはストレージの優れた戦略のように聞こえますか?
深くて広い家系図について、これをどのように効率的に照会しますか?
私が悩まされている問題は、ツリー内のノードで返され、与えられたデータの多形性です。これがPersonオブジェクトのツリーである場合は、再帰共通テーブル式を使用します。ただし、任意のノードに対して3つの異なる形状のデータが返される可能性があります。これを、C#の3つのOOタイプの1つにマップします。明らかにC#またはストアドプロシージャで再帰を実行できますが、過去のそのようなソリューションのパフォーマンスにはあまり満足していません。さらに、レコードを自然に挿入するにはどうすればよいですか?SQL ServerでのFK関係の強制のため、過去には常に正しい順序(Person、次にFatherまたはMother)で挿入する必要がありました。
このタイプのORMを処理するフレームワークはありますか?
編集:
明確にするために、私が必要とする解決策は、表示するために家系図全体を取得し、家系図にノードを追加および編集できるようにすることです。最善の解決策は、深いツリーの1つのクエリでこれを行うことだと思います。スキーマを設計し、保存し、取得する方法は、私が求めているものですか?