+4  A: 

This is a typical Many-To-Many relationship. And the Organization_Users tables is the bridge table. Infact NHibernate and all the other ORM tools have built-in feature to support bridge table.

This thing should be resolved at data modelling level rather than at application level. You should analyze your data model and it is recommended to avoid many-to-many relationships (in the sense if it is not the necesity of domain model, you should try to avoid many-to-many relationship).

First thing first you need to be sure that many-to-many relationship in data model is necessary for mapping domain entities. Once you have done this then the model represented in your diagram is ok for mapping those relationships at application level

Rutesh Makhijani
+2  A: 

The first things to consider in DDD are :

  • forget your database schema (there's no database !)
  • what actions will you perform on thoses entities from a domain perspective ?
Think Before Coding
+1  A: 

My understanding is:

A User can belong to 0-to-many Organizations. AND An Organization consists of 0-to-many Users.

Are both of those correct? If so, that does sound like a many-to-many to me.

In a many-to-many, you pretty much need a relationship-like object of some sort to bridge that gap. The problem is, there is no user_organization in the domain.

This makes me think you shouldn't have user_organization as a part of your domain, per se. It feels like an implementation detail.

On the other hand, maybe it makes sense in your domain to have a Roster which holds the Users in an Organization and stores their role and other information specific to that relationship.

Andy_Vulhop
+2  A: 

I think your model is fine. I usually think of domain aggregate roots, when I think of them at all, in terms of what is publicly exposed, not internal implementation. With relationships I think of which entity "wears the pants" in the relationship. That is, is it more natural to add a User to an Organization or add an Organization to a User? In this case both may make sense, a User joins an Organization; an Organization accepts a User for membership.

If your domain sees the relationship from the User's perspective, you can put the methods to maintain (add, remove, etc.) the relationship on the User and expose a read-only collection on the Organization.

In response to your second design (it would have been better if you had edited the original question): I don't like it at all. Your original design is fine. I wouldn't necessarily ignore the database while designing your classes, a good design should accurately model the domain and be straightforward to implement in a relational database. Sometimes you have to compromise in both directions to hit the sweet spot. There's no jail term for breaking aggregate boundaries. :-)

Jamie Ide
Thanks for your input. Yeah, now that I look at that second design I really don't like it either! :)
CalebHC
A: 
CalebHC
off-topic but I can't resist ... which pen have you used to drawn this diagrams ?
Matthieu
Lol, no problem. I was using a sharpie fine point pen. I thought it would show up good for taking pictures. I guess it worked okay. Not as nice as a class or UML diagram! :)
CalebHC
+2  A: 

I have used an approach similar to your first model on several occasion. The one catch with this approach is that you need to create an OganizationUser class in your domain to handle the Role and Flagged fields from you Domain. This would leave you with something like this in your code.

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;

*If you're going to be iterating through all a users organizations quite often you'd likely want to eager load the Organization entity along with OrganzitionUser

With the second design you submitted it looks like you would be able to add a user to the OrgUserDetails without adding the user to OrganizationUser. That doesn't seem like something I would want to support from my Domain.

Andrew Hanson
Thanks a lot for your answer. That's the exact way I would like to implement this model. You brought up a great point that having to update OrgUserDetails and OrganizationUser with same info isn't such a great idea. I'm going with my first model and adding that OrganizationUser class, like you said, to my Organization domain so I can access those extra attributes. It seems like that will work fine. Thanks again for your help!
CalebHC