2008-09-30 79 views
3

我正在設計一個處理兩組數據的應用程序 - 用戶和區域。數據是從第三方製作的文件中讀取的。我有一個User類和一個Area類,並且數據被讀入一個Users數組和一個Areas數組(或者其他適當的內存結構,這取決於我們所使用的技術)。建模相關對象

這兩個類都有一個從文件讀取的唯一ID成員,而User類包含一個Area ID數組,給出了一個用戶與多個Areas關聯的關係。

的要求很簡單:

  • 用戶列表區的
  • 清單指定區域的用戶的
  • 名單爲指定的用戶

地區

  • 清單我首先想到的是將數據留在兩個數組中,然後對於每個要求,都有一個獨立的方法d根據需要詢問一個或兩個陣列。這將很容易實現,但我不相信這一定是最好的方式。

    然後我想到了在User類上有'Get Areas'方法和Area類中的'Get Users'成員,如果例如我處於有Area對象的階段,我可以通過屬性找到它的用戶,但是如何在Area類上的「獲取用戶」方法意識到/有權訪問Users數組。

    我以前曾經遇到過這個問題,但從來沒有真正想出一個明確的解決方案。也許我只是把它變得比實際更復雜。任何人都可以提供任何提示,網址或書籍來幫助我進行這種設計嗎?

    更新: 謝謝大家花時間留下一些提示。非常感謝您的意見。

    我同意這個問題的根源是多對多的關係。我理解這將如何在關係數據庫中建模,這非常簡單。

    我收到的數據是來自第三方的二進制文件的形式,所以我無法控制這些結構,但是當我讀取它時,我可以以最好的方式存儲它。它有點兒在圓孔中嵌入方塊,但我認爲讀取它然後將其存儲在數據庫中,那麼程序將不得不查詢數據庫以獲得結果。這不是一個大量的數據,所以我認爲通過將它存儲在內存結構中可以獲得我需要的數據。

  • 回答

    0

    爲什麼不使用DataTable與關係,如果涉及.NET?如果涉及.NET,您也可以再次查看泛型。

    +0

    如果我使用.NET,我會用,而不是數組泛型列表。然而,我並沒有太多使用DataTable的經驗。我會調查一下。 – Gavin 2008-10-01 10:26:48

    7

    這的確是一個許多一對多的關係,

    User <<--->> Area 
    

    把它分解成3個對象,用戶,面積和UserArea:

    User: Id, name, etc. 
    Area: Id, name, etc. 
    UserArea: UserId, AreaId 
    
    2

    是否一個區域屬於多個用戶?如果是的話,這在技術上是多對多的關係。如果要將數據轉換爲關係數據庫,則需要創建一個包含所有關係的表。我猜如果你想使用數組,你可以創建第三個數組。或者如果你真的想以OO的方式做到這一點,這兩個類應該有指向相關區域/用戶的指針數組。

    +0

    這就是我在想的那類事情,但並不確定。在指針方面,我必須讀取一個數組(或通用列表或其他),讀取第二個數組,然後有第三個方法來填充每個數組的指針數組? – Gavin 2008-10-01 10:25:36

    0

    一種選擇是爲最後2個要求中的每一個使用字典。即,Dictionary<Area, List<User>>Dictionary<User, List<Area>>。您可以在閱讀數據時將它們建立起來。你甚至可以圍繞這兩個字典包裝一個類,並且只需要爲每個需求提供一個該類的方法。這可以讓你確保字典保持同步。

    +0

    我認爲你的括號被損壞了 – 2008-10-01 14:29:00

    3

    非常基本的,但這個想法是:

    struct/class Membership 
    { 
        int MemberID; 
        int userID; 
        int areaID; 
    } 
    

    這個類實現了「用戶屬於區域」成員的概念。 堅持其中一個爲集合中的每個成員資格,並查詢該集合的子集滿足您的要求。

    編輯:另一種選擇

    你可以在各成員國的存儲區域的列表,並在每個區成員列表。

    面積

    public bool addMember(Member m) 
    { 
        if (/*eligibility Requirements*/) 
        { 
         memberList.add(m); 
         m.addArea(this); 
         return true; 
        } 
        return false; 
    } 
    

    及成員有着相似的應用(沒有回調)

    這樣做的好處是,它是很容易返回一個迭代通過區域行走,發現會員(反之亦然)

    缺點是它是非常緊密耦合,這可能會導致未來的問題。

    我認爲第一個實現更LINQ友好。

    +0

    類似於Steven A. Lowe的想法。我可以做這樣的事情,它看起來就像我在關係數據庫中的那種模型,但在對象方面,我認爲可能有更好的方式讓用戶的一個實例知道它是關聯的用戶反之亦然。 – Gavin 2008-10-01 10:22:20

    1

    對不起,但這不是一個面向對象的問題。這是一個關係問題。因此所有對基數的引用(多對多)。這是關係數據庫建模101.我並不是要批評加文,只是爲了指出一個新的觀點。

    那麼我的咆哮有什麼好處。答案應該是與關係數據存儲集成,而不是將其轉化爲面向對象的範例。這是經典的方形掛釘,圓孔問題。

    0

    與dacracot

    同意也看的DevExpress XPO