1

L2Sを使用しており、次のようなクラスがあります。

public class HumanContainer
{
    public List<IHuman> Humans { get; set; }
    public string SomeOtherProperty { get; set; }
}

私たちのデータベースには次のようなテーブルがあります:
HumanContainer
-Geek

これまでのところ、人間のタイプは1つだけです(オタク)。また、HumanContainersをDBとの間で送受信する場合、それらをオタクとして扱うことがわかっています。2人目の人間(アスリート)が必要になったので、これを実装する方法を選択できます。

1つのオプションは、DBに別のテーブル(Athlete)を作成することです:
HumanContainer
-Geek
-Athlete

このような新しい具体的なHumanごとに、HumanContainer.Humansをループして型を検出し、適切なEntitySet <>に追加して、保存する必要があります。

もう1つのオプションは、すべてのHumanに対して1つのテーブルのみを持つことです
。HumanContainer
-Humans

その場合、Humanを特定のタイプにシリアル化してその列に格納するXML列のようなものが必要になります。次に、データを取得するときにその列を逆シリアル化する必要があります。

推奨されるアプローチの1つはありますか?人々がこの状況にどのように対処してきたのか知りたいです。ここに記載していない3番目のアプローチはありますか?

4

2 に答える 2

1

私はあなたの質問を正しく理解しているので、あなたの場合、将来、異なるタイプの人間がいる可能性があります。次の解決策を試すことができます。

解決策1:

前述のように、データベース「Humas」に1つのテーブルのみを作成し、Humanを特定のタイプにシリアル化し、その列に格納し、データを取得するときにその列を逆シリアル化します。将来、人間のタイプが必要になった場合でも、データベースの設計を変更する必要がないため、このソリューションは適切と思われます。管理が簡単です。

ただし、このソリューションの欠点は、アプリケーションでGeek Humansタイプのみが必要な場合、最初に列データを取得して逆シリアル化する必要があり、その後GeekHumanタイプを見つけることができることです。

解決策2:解決策2:

データベースに2つのテーブルを作成します。1)HumanType:保存用人間のタイプ(オタク、アスリート、またはその他のタイプ)2)Human:人間の情報を保存します。このテーブルには、HumanTypeの参照キーが含まれています。

このソリューションの利点は、要件に基づいてクエリを簡単に実行できることです(たとえば、Geek Type Humanのみがテーブルから簡単にフェッチされます)。また、新しいHuman Typeが発生した場合は、HumanTypeデータベースに入力するために1つのエントリが必要です。

于 2012-09-14T18:15:52.277 に答える
1

あなたがやろうとしているように聞こえるのは、リレーショナルデータベースで継承を表現することです。Guy Bursteinには、このテーマに関する2つの優れた記事があります。方法:データベースでのモデル継承LinqtoSQL継承

于 2012-09-14T16:01:16.133 に答える