2009-09-19 17 views
5

私はサブクラスがVideoImageNote、およびFormの4つのサブクラスを持っています。それぞれに異なるタイプのデータが含まれています。たとえば、Imageクラスには、ディスクおよびイメージプロパティのイメージファイルへのパスが含まれ、Formクラスにはフォームフィールド値が含まれます。各項目間の共通要素は、しかし、GPS座標との見出しであるので、私は、次の抽象基本クラスを持っている:データベースの抽象基本クラスとサブクラスをモデル化します

public abstract class Content 
{ 
    public float? Latitude { get; set; } 
    public float? Longitude { get; set; } 
    public float? Heading { get; set; } 
} 

しかし、私はかすんで取得する場所のデータベースでこれをモデル化する方法です。現在、Eventsというテーブルがあります(例として、イベントは誕生日パーティーとしましょう)と4つのテーブル(VideosImagesNotes、およびForms)があります。各テーブルには、Eventsの主キーにリンクする外部キーがあります。

LINQ-to-SQLを使用して、各テーブルに5つのクラスがあります。たとえば、Event.Imagesのような1種類のデータだけが必要な場合はこれで問題ありませんが、私がしたいのはEventの「内容」の総数を数えてGPS座標を取得することです。私はちょうどEvent.Images.Count() + Event.Videos.Count() + ...を使用するだけで十分に簡単に数えることができますが、私はGPS座標について同じことをすることはできません。データベースをモデル化して、すべてのアイテムに基本クラスを使用できるようにする方法はありますか?また、データを表示する必要があるときに個々の強く型付けされたアイテムを取得できるようにする方法はありますか?

答えて

8

エンタープライズアプリケーションアーキテクチャのMartin Fowler氏のパターン、異なるトレードオフとそれぞれに記載このため3種類のパターンがあります。

+0

感謝。彼らはモデルの使い方を正確に説明していませんが、それは私にもっと研究をする出発点です。個人的には、新しいサブクラスを追加するとデータの新しい列を追加する必要があり、それが望ましくないサイズになることがあるという意味で、単一の表モデルは悪い考えです。小規模のアプリケーションでは、私はそれを使用するメリットを見ることができます。 –

+0

確かに、明確なトレードオフがあります。それは単に新しいタイプを追加する可能性に依存します。もしそうでない場合は、複数のテーブルを走査して1つのテーブルを使用することを避ける方がよいかもしれません。可能であれば、他のパターンの1つ。そして、はい、それらのリンクはあなたが本を買うことを望んでいるのでかなり疎です:-)それは良い本です - 私は考える価値があります。 – SingleShot

1

それはそれを行う一つの方法です。サブクラスごと

  • テーブル:代わりに、データベース内の基底クラスを共有しようとの、ちょうどそれぞれに別々のテーブルを作成

    一般的に言って、他の二つの方法があります。

  • 階層ごとのテーブル:テーブルにすべてのフィールドのスーパーセットと「ディスクリミネータ」列を1つの場所に格納します。

    • あなたは、一般的に独立してそれらを扱う場合、およびクエリが独立して、別々のテーブルはあなたのいずれか何をgo--するための良い方法です:

    が右である把握するために、使用パターンを考えますサブクラスごとにテーブルを持つ

  • これらは異質のコレクションとして扱われる場合は、このようなとしてそれらを見たいので、単一のテーブルは

容易にすることができまた、あなたのツールが最も自然にサポートしてものを参照してください。彼らはすべて働いている。

+0

お返事ありがとうございます。とにかくドメインモデル全体を変更する必要があることが判明したので、私の問題は修正されました。 –

-2

実際、この正確な質問は非常に多くの質問を受け、answered many timesです。おそらく、データベース用語を使用して検索していないでしょう。

問題は、オブジェクト指向ではないオブジェクトの領域でオブジェクト指向用語と思考を適用することです。通常のストレートフォワード作業は非常に複雑で制限されています。

Martin Fowlerの書籍とScott Amblerの書籍は、多くの場合、this answerから始まり、12月10日で始まる詳細は1ドルの価値がありません。

+6

-1、あなたがリンクされた記事が作成される前に、2009年9月19日にこの質問をしました。あなたの答えはまったく答えではなく、業界の私と2人の尊敬される個人に対して、むしろ薄く隠れた侮辱です。ダーニエル@ –

+2

このスレッドは、他の(現在の)スレッド上に登場し続けます。申し訳ありませんが、2009年から気づきませんでした。あなたに向けられた侮辱はありません。ファウラーとアンブラーには多くのことがあります。私は具体的には答えることができて満足していますが、ファウラー/アンブラー、またはあなたの気持ち(たとえば、「侮辱」とは何ですか?)の一般性には応えることができません。 – PerformanceDBA

0

これらの例を見てみると分かります。リンクについて

関連する問題