2009-07-09 34 views
8

我正在建模一個非常基本的ASP.NET MVC應用程序使用NHibernate,我似乎卡在我的設計。這裏是我的模型的草圖:我打破了我的總體界限嗎?

model 1 http://i29.tinypic.com/309614n.jpg

正如你可以看到這是很基本的,但我有一些關於它的擔憂。用戶根實體和組織根實體通過兩個一對多關係訪問同一個Organization_Users實體子實體。這看起來不正確,我認爲我打破了總體邊界。這種模式的氣味給我,但我喜歡這個主意,因爲我想有這樣的代碼:

var user = userRepository.Load(1); 
var list = user.Organizations; // All the organizations the user is a part of. 

var org = orgRepository.Load(1); 
var list = org.Users; // All the users in an organization. 

而且額外的像表中的數據標記和作用將被使用組織實體。這是一個糟糕的設計?如果你有什麼想法會很棒。我仍然試圖讓我的頭腦圍繞DDD的想法。謝謝

回答

2

我曾經多次使用類似於您的第一個模型的方法。採用這種方法的一個原因是,您需要在您的域中創建一個OganizationUser類來處理角色標記爲字段來自您的域。這會讓你在代碼中看到類似的東西。

var user = userRepository.Load(1); 
var list = user.OrganizationUsers; // All the organizations the user is a part of including their role and flagged values. 

var organization = list[0].Organization; 

*如果你將要通過全部用戶的組織往往迭代你很可能要急於負載OrganzitionUser

沿組織實體的第二個設計你提交它看起來像你可以將用戶添加到OrgUserDetails而不需要將用戶添加到OrganizationUser。這似乎並不是我想要從我的域名支持的內容。

4

這是一個典型的多對多關係。 Organization_Users表是橋表。事實上,NHibernate和所有其他的ORM工具都有內置的功能來支持橋接表。

這件事應該在數據建模級而不是在應用級解決。你應該分析你的數據模型,建議避免多對多的關係(從某種意義上說,如果它不是域模型的必要性,你應該儘量避免多對多的關係)。

首先,您需要確保數據模型中的多對多關係對於映射域實體是必需的。一旦你這樣做的話你的圖中所表示的模型是確定在應用級映射這些關係

2

的第一件事情在DDD要考慮的是:

  • 忘記你的數據庫模式(有 沒有數據庫! )
  • 從域的角度來看,您將對哪些實體執行哪些操作?
+1

直到你遇到性能問題,然後你覺得對不起你忘了數據庫:) – 2014-10-16 06:18:45

1

我的理解是:

用戶可以屬於0到許多組織。 AND 一個組織由0到多個用戶組成。

這兩者是否正確?如果是這樣,那聽起來對我來說聽起來像是多對多。

在多對多中,你幾乎需要某種類似關係的對象來填補這個空白。問題是,域中沒有user_organization。

這讓我覺得你不應該有user_organization作爲你的域的一部分,本身。這感覺就像一個實現細節。

另一方面,在您的域中使用組織中的用戶名冊並存儲他們的角色以及特定於該關係的其他信息也許在您的域中有意義。

2

我認爲你的模型很好。當我想到它們時,我通常會想到域聚合根,就公開揭露的內容而言,而不是內部實現。通過關係,我認爲在關係中哪個實體「穿着褲子」。也就是說,將用戶添加到組織或將組織添加到用戶是否更自然?在這種情況下,兩者都可能有意義,用戶加入組織;組織接受用戶的會員資格。

如果您的域從用戶的角度看到關係,則可以將這些方法維護(添加,刪除等)用戶關係並在組織上公開只讀集合。

迴應你的第二個設計(如果你編輯了原始問題,會更好):我根本不喜歡它。你的原創設計很好。在設計你的類時,我不一定會忽略數據庫,一個好的設計應該準確地建立域的模型,並且可以直接在關係數據庫中實現。有時你必須在兩個方向上妥協才能擊中最佳位置。沒有破壞總體邊界的監獄條款。 :-)

+0

感謝您的輸入。是的,現在我看着第二個設計,我真的不喜歡它! :) – CalebHC 2009-07-10 00:59:42

0

謝謝大家的回答。他們一直很有幫助。

雖然我一直在想我的模型多一點,但我勾畫了一些我認爲會更好的新東西。

alt text http://i26.tinypic.com/ic0pw4.png

我的想法是這樣的:

  1. 當用戶登錄到系統中找到自己的帳戶,然後該網站返回的他們是分開的組織的名單,並獲得此信息user_organizations對象。

  2. 當用戶點擊其中一個組織時,它們會將其指向組織的控制面板。

  3. 所選組織然後在其org_user_details中查找該用戶的角色,以瞭解用戶應該具有該組織控制面板的訪問權限。

這有道理嗎? :)

我覺得這將是一個好的模型,但我對數據庫實施有一些疑慮。我知道我不應該擔心它,但我不能破壞我的壞習慣!您可以看到user_organizations對象和org_user_details對象中存在重複的數據。我不是數據庫專家,但是這是一個糟糕的數據庫設計?我是否應該將user_organizations和org_user_details中的數據合併爲一個表格,就像我在第一篇文章中的那樣,並告訴NHibernate,User將它視爲多對多關係,並且組織將其視爲一對多關係?這聽起來像我在欺騙系統。對不起,如果我看起來很困惑。

你對此有何看法?我在想這個嗎? :P

+1

離題,但我無法抗拒......你用哪個筆繪製這張圖? – MatthieuGD 2009-07-13 23:18:45

+0

哈哈,沒問題。我正在使用尖銳的尖筆。我認爲它會顯示出拍照的好處。我想它運作良好。不如一個類或UML圖! :) – CalebHC 2009-07-14 00:11:49