If you want to follow the Driven Driven Design paradigm, then the answer is yes for anything within Aggregate, and no for any cross-referencing.
In almost all cases, you want everything that was in the "Aggregate Root" element to be deleted when the Root itself was deleted, and therefore having foreign keys that represent this, with cascading deletes, will allow you to achieve this at the database level . You can also use your repositories for cascading deletions if you do not want to do this at the database level, but it is still worthwhile that the children of the aggregate should not exist without a root.
For cross-aggregate issues, you are likely to be dealing with business decisions about what should happen when one or the other is removed. Often you will deal with this asynchronously to provide scalability, and therefore your domain model will end up being consistent. Therefore, in these cases it makes no sense to force foreign keys, since there will be times when one or the other key may not exist.
Hope this helps! And for more information, be sure to check out Evans' book on Driven Driven Development - and many links on the Internet too.
Michael hart
source share