2011-03-25 36 views
0

我目前正在編寫一個N層架構的ASP.NET系統,其中有一個相對規範化的SQL數據庫後端,但我正在努力讓我的頭腦在查看值應該如何表示在我的業務對象中(我沒有得到使用EF或ORM的特權)。我的表(作爲一個例子),可以構造這樣的:如何在ASP.NET業務對象中表示查找值?

CoreDataTable:

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

ColoursLookup:

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. Person對象的FavouriteColour屬性設置爲字符串,並在將人物對象寫入數據庫(即獲取顏色名稱並獲取相應的ID)時進行反向查找。這是危險的IMO在不太可能的情況下,兩種顏色在數據庫中具有相同的名稱。
  3. 將ID和值都存儲在Person對象中,並在更新其中一個值時對其進行同步。這似乎過於複雜的一個相對簡單的任務。
  4. 創建兩個表示,Person對象和一個PersonSummary對象,該對象將所有查找值轉換爲它們的描述性名稱,從而取回對象的只讀版本。

我100%確信,我是(一)本得太多,和(b)使得它複雜得多,它需要的。那麼,是否有這樣做的首選方式?或者有沒有我忽略的選項?任何幫助表示讚賞,我一直在解決這個問題幾個小時,但沒有做出決定。

謝謝。

回答

0

回答這個問題的唯一正確方法是選擇一個,測量影響(如果需要,通過原型),然後將其與下一個選項的影響進行比較。

不知道你的系統,我會說選項1可能是最好的 - 如果你緩存一系列Color對象,所以你不需要每次都去數據庫。

+0

嗯,我知道選項4將是最有效的,因爲數據庫只被查詢一次,但我更好奇最好的做法是與查找表。網絡上有大量的資源用於N層,但沒有一個可以解釋查找值。 – 2011-03-25 21:05:22

+0

@Karl:在我所有的工作中,我都緩存了查找表內容(至少是使用的部分)。它還沒有引起問題。 - 你的選擇4聽起來很奇怪。你是說你有兩個不同的同一個對象的表示?我會避開它,除非它們在完全獨立的環境中使用(views/api calls/etc)。 – 2011-03-25 22:03:17

+0

哦,不要誤解我的意思,我不想使用選項4,但我只是說在技術上它是最高效的,因爲除了SQL查詢中的連接之外,不需要查找。謝謝你的幫助! – 2011-03-26 01:44:38

0

如何在填充人員表的查詢中加入顏色表。在person對象上有一個FavouriteColor屬性。該對象不會是表列的真實表示,但所有需要的信息都將在db調用中檢索到。