<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: DDD &amp; Many to Many Object Relational Mapping</title>
	<atom:link href="http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/</link>
	<description>Enterprise Development Expert &#38; SOA Specialist</description>
	<lastBuildDate>Sat, 11 Feb 2012 15:16:10 -0600</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: udidahan</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-37589</link>
		<dc:creator>udidahan</dc:creator>
		<pubDate>Wed, 16 Feb 2011 05:32:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-37589</guid>
		<description>Chandra,

I believe that I said that we would use a separate query to get the job boards by job ID, rather than navigating the collection. That doesn&#039;t defeat the purpose of DDD. I suggest reading up on some of my CQRS material to understand more about how queries should be handled by different objects than commands.</description>
		<content:encoded><![CDATA[<p>Chandra,</p>
<p>I believe that I said that we would use a separate query to get the job boards by job ID, rather than navigating the collection. That doesn&#8217;t defeat the purpose of DDD. I suggest reading up on some of my CQRS material to understand more about how queries should be handled by different objects than commands.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: chandra</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-37588</link>
		<dc:creator>chandra</dc:creator>
		<pubDate>Tue, 15 Feb 2011 11:12:17 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-37588</guid>
		<description>You have said that, query should be used for fetching data from job&#039;s aggregate.

But is that defeat ddd perspective. Why query ?

Do we avoid m to m always and convert that in to 1 to m ?</description>
		<content:encoded><![CDATA[<p>You have said that, query should be used for fetching data from job&#8217;s aggregate.</p>
<p>But is that defeat ddd perspective. Why query ?</p>
<p>Do we avoid m to m always and convert that in to 1 to m ?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: udidahan</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-37468</link>
		<dc:creator>udidahan</dc:creator>
		<pubDate>Tue, 28 Sep 2010 18:20:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-37468</guid>
		<description>3D noob,

I&#039;m not exactly sure how to respond to you. While multiple users may want to view the same information slightly differently, that doesn&#039;t always translate to different bounded contexts - often its just different query screens. When working with CQRS, these queries aren&#039;t served off of the domain model so you can do almost anything you like there.</description>
		<content:encoded><![CDATA[<p>3D noob,</p>
<p>I&#8217;m not exactly sure how to respond to you. While multiple users may want to view the same information slightly differently, that doesn&#8217;t always translate to different bounded contexts &#8211; often its just different query screens. When working with CQRS, these queries aren&#8217;t served off of the domain model so you can do almost anything you like there.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: p47l4f0n [3D noob]</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-37467</link>
		<dc:creator>p47l4f0n [3D noob]</dc:creator>
		<pubDate>Mon, 27 Sep 2010 10:22:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-37467</guid>
		<description>Hello, many thanks to you for this very valuable post and also to others for their comments.
I&#039;d know if this coul&#039;d be the solution for that problem:
  - there are 2 really independent entities.
  - there are 4 points of view at the relationship between them
    1) Job is independent, doesn&#039;t know about any JobBoard AND
     JobBoard is independent, doesn&#039;t know about any Job (it&#039;s just a PostBoard) [potentional Employee&#039;s view]
    2) Job knows about JobBoard, but &quot;PostBoard&quot; doesn&#039;t know about any Jobs [HR manager&#039;s view]
    3) Job doesn&#039;t know, that it&#039;s been posted anywhere, but JobBoard knows Jobs [JobBoard manager&#039;s view]
    4) Job and JobBoard know them both. [Programmers view]

If we are implementing just one point of view (is it bounded context?), there is one or two agreggate root(s)
If we are implementing more than one PoV, there are more agregate roots up to four. Here I feel that the max value of combinations could be get by some kind of math formula...
Could this simply help us to check quickly, if we&#039;ve been right for one aggregate root, if we expected two PoV?</description>
		<content:encoded><![CDATA[<p>Hello, many thanks to you for this very valuable post and also to others for their comments.<br />
I&#8217;d know if this coul&#8217;d be the solution for that problem:<br />
  &#8211; there are 2 really independent entities.<br />
  &#8211; there are 4 points of view at the relationship between them<br />
    1) Job is independent, doesn&#8217;t know about any JobBoard AND<br />
     JobBoard is independent, doesn&#8217;t know about any Job (it&#8217;s just a PostBoard) [potentional Employee's view]<br />
    2) Job knows about JobBoard, but &#8220;PostBoard&#8221; doesn&#8217;t know about any Jobs [HR manager's view]<br />
    3) Job doesn&#8217;t know, that it&#8217;s been posted anywhere, but JobBoard knows Jobs [JobBoard manager's view]<br />
    4) Job and JobBoard know them both. [Programmers view]</p>
<p>If we are implementing just one point of view (is it bounded context?), there is one or two agreggate root(s)<br />
If we are implementing more than one PoV, there are more agregate roots up to four. Here I feel that the max value of combinations could be get by some kind of math formula&#8230;<br />
Could this simply help us to check quickly, if we&#8217;ve been right for one aggregate root, if we expected two PoV?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Christian</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-37023</link>
		<dc:creator>Christian</dc:creator>
		<pubDate>Mon, 08 Feb 2010 10:53:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-37023</guid>
		<description>Just a stupid question. Why is an address a value object???</description>
		<content:encoded><![CDATA[<p>Just a stupid question. Why is an address a value object???</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Elegant Code &#187; Tips for ORM Data Access</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-36838</link>
		<dc:creator>Elegant Code &#187; Tips for ORM Data Access</dc:creator>
		<pubDate>Thu, 12 Nov 2009 21:22:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-36838</guid>
		<description>[...] Learn how to identify the right aggregate [...]</description>
		<content:encoded><![CDATA[<p>[...] Learn how to identify the right aggregate [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Part 9: NHibernate transactions - NHibernate blog - NHibernate Forge</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-36677</link>
		<dc:creator>Part 9: NHibernate transactions - NHibernate blog - NHibernate Forge</dc:creator>
		<pubDate>Tue, 08 Sep 2009 11:58:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-36677</guid>
		<description>[...] Partial failures can be good. The programmer in all of us sees that and screams atomicity. Transactions&#160; should be all-or-nothing. Anything less is just wrong. Right? In real life, there are instances where we allow, and even prefer partial failures of business transactions. Udi gives us a great example. Would you leave the grocery store empty handed simply because they were out of one item on your list? Probably not. When you’re gathering requirements, be sure to ask questions about the proper way to fail. “Roll it all back” isn’t the only option. [...]</description>
		<content:encoded><![CDATA[<p>[...] Partial failures can be good. The programmer in all of us sees that and screams atomicity. Transactions&#160; should be all-or-nothing. Anything less is just wrong. Right? In real life, there are instances where we allow, and even prefer partial failures of business transactions. Udi gives us a great example. Would you leave the grocery store empty handed simply because they were out of one item on your list? Probably not. When you’re gathering requirements, be sure to ask questions about the proper way to fail. “Roll it all back” isn’t the only option. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Part 9: NHibernate transactions &#171; BASICly everything</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-36676</link>
		<dc:creator>Part 9: NHibernate transactions &#171; BASICly everything</dc:creator>
		<pubDate>Tue, 08 Sep 2009 11:53:51 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-36676</guid>
		<description>[...] Partial failures can be good. The programmer in all of us sees that and screams atomicity. Transactions&#160; should be all-or-nothing. Anything less is just wrong. Right? In real life, there are instances where we allow, and even prefer partial failures of business transactions. Udi gives us a great example. Would you leave the grocery store empty handed simply because they were out of one item on your list? Probably not. When you’re gathering requirements, be sure to ask questions about the proper way to fail. “Roll it all back” isn’t the only option. [...]</description>
		<content:encoded><![CDATA[<p>[...] Partial failures can be good. The programmer in all of us sees that and screams atomicity. Transactions&#160; should be all-or-nothing. Anything less is just wrong. Right? In real life, there are instances where we allow, and even prefer partial failures of business transactions. Udi gives us a great example. Would you leave the grocery store empty handed simply because they were out of one item on your list? Probably not. When you’re gathering requirements, be sure to ask questions about the proper way to fail. “Roll it all back” isn’t the only option. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: udidahan</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-36069</link>
		<dc:creator>udidahan</dc:creator>
		<pubDate>Mon, 09 Mar 2009 22:04:05 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-36069</guid>
		<description>Ramin,

I&#039;d need a fair bit more information about the other use cases and relevant data to say anything about the scenario you&#039;re alluding to.</description>
		<content:encoded><![CDATA[<p>Ramin,</p>
<p>I&#8217;d need a fair bit more information about the other use cases and relevant data to say anything about the scenario you&#8217;re alluding to.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ramin</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-36061</link>
		<dc:creator>Ramin</dc:creator>
		<pubDate>Fri, 06 Mar 2009 09:48:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-36061</guid>
		<description>If the board not only posts jobs but other information, would you then have 3 aggregates roots: job, info-board and info-board-job-posting? Would the info-board-job-posting aggregate root then subscribe to the two others in a publish/subscribe solution? How would that be best modeled?</description>
		<content:encoded><![CDATA[<p>If the board not only posts jobs but other information, would you then have 3 aggregates roots: job, info-board and info-board-job-posting? Would the info-board-job-posting aggregate root then subscribe to the two others in a publish/subscribe solution? How would that be best modeled?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: udidahan</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-36000</link>
		<dc:creator>udidahan</dc:creator>
		<pubDate>Tue, 03 Feb 2009 09:44:25 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-36000</guid>
		<description>Nuno,

It&#039;s not that the partial failures dictate which object is the aggregate root, but they indicate that the intuitive answer isn&#039;t necessarily correct.

&gt; IMHO there is no such thing as partial failures

Well, that&#039;s a question that should be put to the business. If we include in the discussion the time within which the system will be consistent one way or the other (say, 1 minute), you may find that partial failures and eventual consistency are quite acceptable.

Also, it&#039;s usually easier to scale a system built around partial failures than one founded in 100% consistency.

And thanks for sharing your personal views - it&#039;s really valuable seeing other perspectives.</description>
		<content:encoded><![CDATA[<p>Nuno,</p>
<p>It&#8217;s not that the partial failures dictate which object is the aggregate root, but they indicate that the intuitive answer isn&#8217;t necessarily correct.</p>
<p>> IMHO there is no such thing as partial failures</p>
<p>Well, that&#8217;s a question that should be put to the business. If we include in the discussion the time within which the system will be consistent one way or the other (say, 1 minute), you may find that partial failures and eventual consistency are quite acceptable.</p>
<p>Also, it&#8217;s usually easier to scale a system built around partial failures than one founded in 100% consistency.</p>
<p>And thanks for sharing your personal views &#8211; it&#8217;s really valuable seeing other perspectives.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dew Drop - February 1, 2009 &#124; Alvin Ashcraft's Morning Dew</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35992</link>
		<dc:creator>Dew Drop - February 1, 2009 &#124; Alvin Ashcraft's Morning Dew</dc:creator>
		<pubDate>Sun, 01 Feb 2009 20:59:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35992</guid>
		<description>[...] DDD &amp; Many to Many Object Relational Mapping and ALT.NET DDD Podcast (Udi Dahan) [...]</description>
		<content:encoded><![CDATA[<p>[...] DDD &amp; Many to Many Object Relational Mapping and ALT.NET DDD Podcast (Udi Dahan) [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nuno Lopes</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35989</link>
		<dc:creator>Nuno Lopes</dc:creator>
		<pubDate>Fri, 30 Jan 2009 16:13:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35989</guid>
		<description>I failed to mention interactions my explanation so here it is on the service layer:

// begin transaction
....
JobVacancyPost aJVP = new JobVancncyPost(Job); // usually this is how roles are created
aJVP.Send(aJobBoard)
tx.Commit();
...
// end transaction

IMHO there is no such thing as partial failures. If there is business rule stating that all Job Vacancies should be advertised or not at all, then most probabably a JobVancancySheet is in order. If this the case we would have:

....
try catch()
{
tx.begin()
var job = s.Get(jobId);
JobVacancySheet aJVS = new JobVacancySheet();
foreach(Guid id in boardIds)
  {
     aJVS.Add(aJob, session.Get(id));
  }
JobVacancySheet.Send();
tx.Commit()
}
catch {Exception ex)
{
   // depending on the expcetion it would postpone sending to later (say external services are down) or fail completely advising the user to correct the sheet.
}

Nuno Lopes
PS: This are my personal views, in no way whatsover they are absolute.</description>
		<content:encoded><![CDATA[<p>I failed to mention interactions my explanation so here it is on the service layer:</p>
<p>// begin transaction<br />
&#8230;.<br />
JobVacancyPost aJVP = new JobVancncyPost(Job); // usually this is how roles are created<br />
aJVP.Send(aJobBoard)<br />
tx.Commit();<br />
&#8230;<br />
// end transaction</p>
<p>IMHO there is no such thing as partial failures. If there is business rule stating that all Job Vacancies should be advertised or not at all, then most probabably a JobVancancySheet is in order. If this the case we would have:</p>
<p>&#8230;.<br />
try catch()<br />
{<br />
tx.begin()<br />
var job = s.Get(jobId);<br />
JobVacancySheet aJVS = new JobVacancySheet();<br />
foreach(Guid id in boardIds)<br />
  {<br />
     aJVS.Add(aJob, session.Get(id));<br />
  }<br />
JobVacancySheet.Send();<br />
tx.Commit()<br />
}<br />
catch {Exception ex)<br />
{<br />
   // depending on the expcetion it would postpone sending to later (say external services are down) or fail completely advising the user to correct the sheet.<br />
}</p>
<p>Nuno Lopes<br />
PS: This are my personal views, in no way whatsover they are absolute.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nuno Lopes</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35987</link>
		<dc:creator>Nuno Lopes</dc:creator>
		<pubDate>Fri, 30 Jan 2009 15:44:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35987</guid>
		<description>I liked the mention of partial failures and its often forgotten in batch business transactions scenarios. Nevertheless I fail to understand how that particular business requirement actually mandates who the root should be.

Whoever read Streamlined Object Modelling (wich I strongly advise) basically understand that the collaboration director between two objects should have the business function (your aggregate root), the other is optional. Now the collaboration director depends on the complexitiy of business rules within that collaboration. 

* Does the JobBoard imposes any constraints over inlisting Job Vancacies?

* Does the Job (or a Job with status vacant) imposes any constraints over advertising on specific JobBoards (one would not publish a Job Vacancy of Finantial Director of a top 5 company on an IT Job Boards)?

In a situation like this Many-To-Many usually the collaboration director should be the one who carries the most complex business constraints.

I&#039;m always very, very suspicious about Many to Many relationships. In most cases it means that the domain is not well understood as roles are not in place (Modeling in Color &amp; Streamlined Object Modeling).

Let me explain.

You are absolutely right, we should not couple what does not need to be coupled. That is, if the Job class represents mostely anything else then a Job Vacancy ready to be advertised then a new Class JobVacancyPost is needed. This JobVacancyPost is the Role of a Job within this collaboration (read Modeling in Color or serch for the Domain Neutral Componentt) modelled as a separate class, not even part of the core HR domain of a Company (where Job and JobSpecification are modeled).

Job{1:N} JobVacancyPost (Role+MI) {N:1} JobBoard

JobVacancyPost is a first order object in the domain (as it workds as a Role of Job and a Post in a Job Board) so it does not hurt anyone to state that it should be located by a Repository.

&quot;That’s not so bad, but not as pretty as object traversal.&quot;

There is no such thing IMHO. if the natural way would be through object transversal means that the domain is not well understood by the developer (aka as not well mapped).  

In other words we can most of the times reduce a M:N relationship to either {1:N} or to {1:N:1} only if the domain allows from pure DDD (othwerwise Domain Drive = Model Driven IMHO), nothing else nothing more. If not more sooner then later you will face problems, hacks and turns.

Execuse my ramblings in my first post and I&#039;m learning.

Nuno Lopes
PS: If people don&#039;t know what DNC is look for this http://www.step-10.com/SoftwareDesign/ModellingInColour/TheDomainNeutralComponent.htmlor this http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf</description>
		<content:encoded><![CDATA[<p>I liked the mention of partial failures and its often forgotten in batch business transactions scenarios. Nevertheless I fail to understand how that particular business requirement actually mandates who the root should be.</p>
<p>Whoever read Streamlined Object Modelling (wich I strongly advise) basically understand that the collaboration director between two objects should have the business function (your aggregate root), the other is optional. Now the collaboration director depends on the complexitiy of business rules within that collaboration. </p>
<p>* Does the JobBoard imposes any constraints over inlisting Job Vancacies?</p>
<p>* Does the Job (or a Job with status vacant) imposes any constraints over advertising on specific JobBoards (one would not publish a Job Vacancy of Finantial Director of a top 5 company on an IT Job Boards)?</p>
<p>In a situation like this Many-To-Many usually the collaboration director should be the one who carries the most complex business constraints.</p>
<p>I&#8217;m always very, very suspicious about Many to Many relationships. In most cases it means that the domain is not well understood as roles are not in place (Modeling in Color &amp; Streamlined Object Modeling).</p>
<p>Let me explain.</p>
<p>You are absolutely right, we should not couple what does not need to be coupled. That is, if the Job class represents mostely anything else then a Job Vacancy ready to be advertised then a new Class JobVacancyPost is needed. This JobVacancyPost is the Role of a Job within this collaboration (read Modeling in Color or serch for the Domain Neutral Componentt) modelled as a separate class, not even part of the core HR domain of a Company (where Job and JobSpecification are modeled).</p>
<p>Job{1:N} JobVacancyPost (Role+MI) {N:1} JobBoard</p>
<p>JobVacancyPost is a first order object in the domain (as it workds as a Role of Job and a Post in a Job Board) so it does not hurt anyone to state that it should be located by a Repository.</p>
<p>&#8220;That’s not so bad, but not as pretty as object traversal.&#8221;</p>
<p>There is no such thing IMHO. if the natural way would be through object transversal means that the domain is not well understood by the developer (aka as not well mapped).  </p>
<p>In other words we can most of the times reduce a M:N relationship to either {1:N} or to {1:N:1} only if the domain allows from pure DDD (othwerwise Domain Drive = Model Driven IMHO), nothing else nothing more. If not more sooner then later you will face problems, hacks and turns.</p>
<p>Execuse my ramblings in my first post and I&#8217;m learning.</p>
<p>Nuno Lopes<br />
PS: If people don&#8217;t know what DNC is look for this <a href="http://www.step-10.com/SoftwareDesign/ModellingInColour/TheDomainNeutralComponent.htmlor" rel="nofollow">http://www.step-10.com/SoftwareDesign/ModellingInColour/TheDomainNeutralComponent.htmlor</a> this <a href="http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf" rel="nofollow">http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: udidahan</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35983</link>
		<dc:creator>udidahan</dc:creator>
		<pubDate>Thu, 29 Jan 2009 22:57:38 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35983</guid>
		<description>Marc, Andy,

You&#039;re both right.
In one bounded context, Job is an aggregate root, in another, it&#039;s Job Board.</description>
		<content:encoded><![CDATA[<p>Marc, Andy,</p>
<p>You&#8217;re both right.<br />
In one bounded context, Job is an aggregate root, in another, it&#8217;s Job Board.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Andy Hitchman</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35980</link>
		<dc:creator>Andy Hitchman</dc:creator>
		<pubDate>Tue, 27 Jan 2009 21:52:38 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35980</guid>
		<description>I&#039;d suggest that Job is probably more important to the users managing recruitment. The domain around Jobs is likely much richer than this example has so far explored. This would lead me to infer that Job is the aggregate root. 

If you wish to abstract the association of Job Board to Job, then perhaps a service to control the publication of Jobs to Job Boards is more appropriate.</description>
		<content:encoded><![CDATA[<p>I&#8217;d suggest that Job is probably more important to the users managing recruitment. The domain around Jobs is likely much richer than this example has so far explored. This would lead me to infer that Job is the aggregate root. </p>
<p>If you wish to abstract the association of Job Board to Job, then perhaps a service to control the publication of Jobs to Job Boards is more appropriate.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Marc Brooks</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35978</link>
		<dc:creator>Marc Brooks</dc:creator>
		<pubDate>Tue, 27 Jan 2009 05:10:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35978</guid>
		<description>So, can a job &quot;be&quot; until it&#039;s been posted to a board?  Is a board useful (in an non-admin sense / more than a lookup table) until some job is posted to it?

Perhaps the REAL root is the Job Posting, which is queried for matching jobs or boards. I&#039;ve found that most output/report pages (which is what most software is about--getting the data out in useful projections) is presented in some form of list, so defining the aggregate root &quot;property&quot; as a collection of JobBoardPosting is the clearest approach to me.</description>
		<content:encoded><![CDATA[<p>So, can a job &#8220;be&#8221; until it&#8217;s been posted to a board?  Is a board useful (in an non-admin sense / more than a lookup table) until some job is posted to it?</p>
<p>Perhaps the REAL root is the Job Posting, which is queried for matching jobs or boards. I&#8217;ve found that most output/report pages (which is what most software is about&#8211;getting the data out in useful projections) is presented in some form of list, so defining the aggregate root &#8220;property&#8221; as a collection of JobBoardPosting is the clearest approach to me.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Michael Hart</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35974</link>
		<dc:creator>Michael Hart</dc:creator>
		<pubDate>Mon, 26 Jan 2009 23:32:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35974</guid>
		<description>@Sean - I assume that Udi meant the shift from many-to-many to one-to-many only happened in the mapping itself (ie, the Job class no longer has a property relating to JobBoard at all - whether singular or plural). A many-to-many is really like two one-to-manys and in this case one of those has been hidden at the object level. The database tables could still be mapped in the original many-to-many fashion.</description>
		<content:encoded><![CDATA[<p>@Sean &#8211; I assume that Udi meant the shift from many-to-many to one-to-many only happened in the mapping itself (ie, the Job class no longer has a property relating to JobBoard at all &#8211; whether singular or plural). A many-to-many is really like two one-to-manys and in this case one of those has been hidden at the object level. The database tables could still be mapped in the original many-to-many fashion.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: udidahan</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35970</link>
		<dc:creator>udidahan</dc:creator>
		<pubDate>Mon, 26 Jan 2009 20:18:23 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35970</guid>
		<description>Ayende, Tapio, Sean,

For me, &quot;aggregate root&quot; is the DDD term for &quot;only calling one method on one object in your service layer&quot;. In other words, it&#039;s use case specific, and not an inherent structural property of the domain model.

Hope that helps.</description>
		<content:encoded><![CDATA[<p>Ayende, Tapio, Sean,</p>
<p>For me, &#8220;aggregate root&#8221; is the DDD term for &#8220;only calling one method on one object in your service layer&#8221;. In other words, it&#8217;s use case specific, and not an inherent structural property of the domain model.</p>
<p>Hope that helps.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Sean Chambers</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35969</link>
		<dc:creator>Sean Chambers</dc:creator>
		<pubDate>Mon, 26 Jan 2009 12:59:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35969</guid>
		<description>Excellent example, but you seem to have removed one of the requirements that you originally stated to get it to fit into your example:

&quot;A job can be posted to multiple job boards. And a job board can have multiple jobs posted.&quot;

If thats the case, how can you still achieve that with a Job only belonging to one job board? It seems like your example works, but violates the requirements that were originally stated.</description>
		<content:encoded><![CDATA[<p>Excellent example, but you seem to have removed one of the requirements that you originally stated to get it to fit into your example:</p>
<p>&#8220;A job can be posted to multiple job boards. And a job board can have multiple jobs posted.&#8221;</p>
<p>If thats the case, how can you still achieve that with a Job only belonging to one job board? It seems like your example works, but violates the requirements that were originally stated.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: BizTalk Linkflood, January 26, 2009 &#171; ADA ICT Devsquad&#8217;s Blog</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35968</link>
		<dc:creator>BizTalk Linkflood, January 26, 2009 &#171; ADA ICT Devsquad&#8217;s Blog</dc:creator>
		<pubDate>Mon, 26 Jan 2009 09:23:33 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35968</guid>
		<description>[...] DDD &amp; Many to Many Object Relational Mapping&#160; [...]</description>
		<content:encoded><![CDATA[<p>[...] DDD &amp; Many to Many Object Relational Mapping&nbsp; [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reflective Perspective - Chris Alcock &#187; The Morning Brew #272</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35967</link>
		<dc:creator>Reflective Perspective - Chris Alcock &#187; The Morning Brew #272</dc:creator>
		<pubDate>Mon, 26 Jan 2009 08:07:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35967</guid>
		<description>[...] DDD &amp; Many to Many Object Relational Mapping - Udi Dahan takes a look at the complexities of Many To Many Mappings using ORM technology from an architectural / DDD standpoint. [...]</description>
		<content:encoded><![CDATA[<p>[...] DDD &amp; Many to Many Object Relational Mapping &#8211; Udi Dahan takes a look at the complexities of Many To Many Mappings using ORM technology from an architectural / DDD standpoint. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: New and Notable 283 : Sam Gentile's Blog (if (DeveloperTask == Communication &#38;&#38; OS == Windows)</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35962</link>
		<dc:creator>New and Notable 283 : Sam Gentile's Blog (if (DeveloperTask == Communication &#38;&#38; OS == Windows)</dc:creator>
		<pubDate>Sun, 25 Jan 2009 17:24:08 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35962</guid>
		<description>[...] Udi on DDD &amp; Many to Many Object Relational Mapping [...]</description>
		<content:encoded><![CDATA[<p>[...] Udi on DDD &amp; Many to Many Object Relational Mapping [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tapio Kulmala</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35961</link>
		<dc:creator>Tapio Kulmala</dc:creator>
		<pubDate>Sun, 25 Jan 2009 09:45:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35961</guid>
		<description>If the Job entity has a meaning outside of the context of the Job Board, it&#039;s not part of the Job Board aggregate. A Job Board will have a reference to it but it does not make it part of the aggregate. 

Tapio</description>
		<content:encoded><![CDATA[<p>If the Job entity has a meaning outside of the context of the Job Board, it&#8217;s not part of the Job Board aggregate. A Job Board will have a reference to it but it does not make it part of the aggregate. </p>
<p>Tapio</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ayende Rahien</title>
		<link>http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/comment-page-1/#comment-35958</link>
		<dc:creator>Ayende Rahien</dc:creator>
		<pubDate>Sat, 24 Jan 2009 20:34:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/#comment-35958</guid>
		<description>If I understand you correctly, Job Board is the aggregated root. But Job doesn&#039;t know about Job Board.

The problem with that is that now you have Job taking part in several aggregated roots. Doesn&#039;t this defeat the whole purpose of aggregated roots?</description>
		<content:encoded><![CDATA[<p>If I understand you correctly, Job Board is the aggregated root. But Job doesn&#8217;t know about Job Board.</p>
<p>The problem with that is that now you have Job taking part in several aggregated roots. Doesn&#8217;t this defeat the whole purpose of aggregated roots?</p>
]]></content:encoded>
	</item>
</channel>
</rss>

