Based on my readings, the recommendation in DDD is that an aggregate root should not hold references to another aggregate root. It's preferred to just hold a reference to the ID. I'm trying to figure out if my case would warrant breaking the rule or not.
Using an accounting system as an example, say you have an invoice as an aggregate root. That invoice has lines and payments, those can be entities under the root. But then an invoice also is assigned to a buyer and a supplier. The line items are also linked to accounts, which can have budgets. Buyer, supplier, budget, those are all entities in their own right, that need to be managed and have their own set of rules. But they also affect the business rules in processing invoices. Sure, I can create a domain service and use it to load things separately, but doesn't that just make my domain object less performant and more anemic?
If I can hold a reference to the entity, I can run a single query and just grab all the data I need (I'd be using Entity Framework Core in .NET). If I go with holding a reference to the foreign key, I then need to run a call for each one of the other aggregates I need. And then my domain object can no longer be as rich as it was on its own because it can't process all the business rules it needs without some outside orchestrator (the domain service).
Another thing I wonder is given that these items are NOT going to be modified by the aggregate root at all and are essentially read-only in that context, does that mean I could have them in the same aggregate with a more limited model (the strict minimum), and then they would also have their own aggregate root (so for example I'd have two Budget entities, one under the Invoice root and one under the Budget root). My thinking is that DDD does not really concern itself with the underlying storage, so seems like that could be a valid a option. The entities for a buyer/supplier/budget would also likely be greatly simplified if they were an entity under the invoice aggregate root, whereas the aggregate root version of them would be much more complex, have more properties, business logic, etc.