0

私は現在、比較的正規化された SQL データベース バックエンドを備えた N 層アーキテクチャの ASP.NET システムを作成していますが、ビジネス オブジェクトでルックアップ値をどのように表現すべきかについて頭を悩ませています (権限がありません)。 EF または ORM を使用する方法)。私のテーブル(例として)は次のように構成できます:

CoreDataTable:

ID | Name  | Favourite_Colour
---|-------|-----------------
01 | Peter | 01
02 | John  | 03
03 | Mary  | 05

カラールックアップ:

ID | Colour | is_active
---|--------|----------
01 | Red    | 1
02 | Green  | 1
03 | Blue   | 1
04 | Pink   | 1
05 | Black  | 1

最初に、次のようなビジネス オブジェクトを作成しました。

public class Person
{
    protected int PersonID { get; set; }
    public string Name { get; set; }
    public int FavouriteColour { get; set; }
}

しかし、たとえば、データベース内のすべての人を好きな色とともにリストしたい場合はどうすればよいでしょうか? ルックアップ ID だけを表示することはできないため、現時点では 4 つのオプションが表示されます。

  1. Person.GetColourStringValue呼び出されたときにデータベースから色の名前を取得する、呼び出されたクラスにメソッドを追加します。100 個の "Person" オブジェクトに対してこのメ​​ソッドを使用すると、100 個のデータベース クエリが発生するため、これは非効率的です。
  2. オブジェクトのFavouriteColourプロパティをPerson文字列として保持し、人物オブジェクトをデータベースに書き込むたびに逆引きを行います (つまり、色の名前を取得し、対応する ID を取得します)。これは、データベース内で 2 つの色が同じ名前を持つというまれな状況では危険な IMO です。
  3. ID と値の両方をPersonオブジェクトに保存し、いずれかの値が更新されるたびにそれらを同期します。これは、比較的単純なタスクとしては複雑すぎるようです。
  4. Personオブジェクトと、PersonSummaryオブジェクトの読み取り専用バージョンをプルバックするオブジェクトの 2 つの表現を作成し、すべてのルックアップ値をわかりやすい名前に変換します。

私は、(a) これを考えすぎており、(b) 必要以上に複雑にしていると 100% 確信しています。それで、これを行う好ましい方法はありますか?または、私が見落としているオプションはありますか?何か助けをいただければ幸いです。私は何時間もこれに取り組んできましたが、決定には至りませんでした。

ありがとう。

4

2 に答える 2

0

person テーブルにデータを入力するクエリで color テーブルに結合するのはどうですか。person オブジェクトに FavouriteColor プロパティを設定します。オブジェクトはテーブル列の真の表現ではありませんが、必要なすべての情報は db 呼び出しで取得されます。

于 2011-03-25T14:26:08.387 に答える
0

これに答える唯一の適切な方法は、1 つを選択し、(必要に応じてプロトタイプを使用して) 影響を測定し、それを次のオプションの影響と比較することです。

システムを知らなくても、オプション 1 が最適である可能性が高いと言えます。一連の Color オブジェクトをキャッシュして、毎回データベースにアクセスする必要がないようにする場合です。

于 2011-03-25T14:27:22.180 に答える