私は現在、比較的正規化された 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 つのオプションが表示されます。
Person.GetColourStringValue
呼び出されたときにデータベースから色の名前を取得する、呼び出されたクラスにメソッドを追加します。100 個の "Person" オブジェクトに対してこのメソッドを使用すると、100 個のデータベース クエリが発生するため、これは非効率的です。- オブジェクトの
FavouriteColour
プロパティをPerson
文字列として保持し、人物オブジェクトをデータベースに書き込むたびに逆引きを行います (つまり、色の名前を取得し、対応する ID を取得します)。これは、データベース内で 2 つの色が同じ名前を持つというまれな状況では危険な IMO です。 - ID と値の両方を
Person
オブジェクトに保存し、いずれかの値が更新されるたびにそれらを同期します。これは、比較的単純なタスクとしては複雑すぎるようです。 Person
オブジェクトと、PersonSummary
オブジェクトの読み取り専用バージョンをプルバックするオブジェクトの 2 つの表現を作成し、すべてのルックアップ値をわかりやすい名前に変換します。
私は、(a) これを考えすぎており、(b) 必要以上に複雑にしていると 100% 確信しています。それで、これを行う好ましい方法はありますか?または、私が見落としているオプションはありますか?何か助けをいただければ幸いです。私は何時間もこれに取り組んできましたが、決定には至りませんでした。
ありがとう。