3

私はキャリアの中でこの問題に数回遭遇しましたが、解決策に満足したことは一度もありませんでした。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つのクエリでこれを行うことだと思います。スキーマを設計し、保存し、取得する方法は、私が求めているものですか?

4

3 に答える 3

2

私が適切な答えを出すことができる唯一の部分は、ORMフレームワークについてです。NHibernateは、テーブルの継承を処理するのに非常に優れています。たとえば、マッピングを正しくすると、保存する母または父ごとにPersonエンティティが保存されます。

継承マッピングを確認してください

于 2008-12-29T02:50:06.603 に答える
0

あなたの特定のケースがどれほど難しいかわかりません。父と母のコードが異なる動作をしない場合、別のクラスは必要ありません。person をサブクラス化する必要さえないかもしれません。

スーパークラスと 2 つのサブクラスが必要であり、(フラット テーブル内のすべてのプリミティブ プロパティを GUID 化するのではなく) テーブル ダイアグラムをある程度読みやすくしたい場合は、サブクラス A とサブクラス B のデータをスーパータイプデータを持つテーブルへの外部キー関係を持つそれぞれのテーブル。

Has-A 関係がサブタイプに依存する場合は、それを適切なサブクラス テーブルに列として配置し、person への外部キー制約を設定します。

何か不足していますか?このソリューションを実装する際に直面している問題を説明していただけると助かります。

于 2010-03-29T13:46:01.687 に答える
0

Person に母と父を設定する必要はありません。Person ごとに 2 つの親を関連付けるだけです。属性「性別」を持つ個人を識別すると、男性は自動的に父親になり、女性は母親になります。

于 2010-01-14T20:48:58.427 に答える