Are Aggregate Roots just Entities with invariants over their contents? <p>A <code>Network</code> is composed of <code>Node</code>s that are connected with <code>Fiber</code>s. The <code>Network</code> is responsible for making sure that:</p> <ol> <li>both ends of any fiber are connected to a <code>Node</code>; </li> <li>that no two ends are connected to the same <code>Node</code>;</li> <li>that no two nodes can be in the same (x, y) location;</li> <li>a network has a limit of 10 nodes and 10 fibers.</li> </ol> <p>Both the <code>Network</code>, the <code>Node</code> and the <code>Fiber</code> are information-rich (they have a name, a date when they were deployed, etc), and it looks to me as if <code>Network</code> is an Aggregate Root (as its the container of both <code>Node</code>s and <code>Fibers</code> and forces invariants between them).</p> <p>I'm at this point also sure that <code>Node</code> and <code>Fiber</code> are entities, and that they are also probably Aggregate Roots.</p> <p>One possible implementation of the <code>Network</code> class might be as follows:</p> <pre><code>class Network { private final NetworkId id; private String name; private Location location; ... private final Map&lt;FiberId, Fiber&gt; fibers = new HashMap&lt;FiberId, Fiber&gt;(); private final Map&lt;NodeId, Fiber&gt; nodes = new HashMap&lt;NodeId, Node&gt;(); } </code></pre> <p>which poses a big problem if my use case is just to edit the location or the name of the <code>Network</code>. In that case I just don't care about fibers and nodes and realistically, it is expected them to be quite possible for their numbers to be on the order of 10k-100k nodes/fibers! How should I approach this issue? Should I separate the definition of a <code>Network</code> (containing <code>fibers</code> and <code>nodes</code> and their invariants) from the rest of the fields? </p> <p>I've always thought of Aggregate Roots as Entities that have a set of invariants to hold over its attributes, in contrast with Entities that just don't care abouts the state of their attributes (for instance, a Person defined with a name and age wouldn't probably need to have any kind of checking for invalid combinations of name and age).</p> <p>Following this philosophy, I generally tend to decide whether some domain concept is either a Value, Entity, Value or Event and then if it's an Entity, if it's an Aggregate Root. Is my assumption flawed?</p> <p>Thanks</p>