It depends on your queries and the change frequency of D. For example, if none of the data D is ever displayed in a list view, denormalization probably doesn't make sense in the first place. If the data D is modified very often, keeping the data in sync will be tedious and expensive, so again, that would indicate de-normalization is not your best option here.
If you want to show a list of posts and some details about the location, your join/subquery becomes a bit more complex, involving a $in
. Still, those queries are relatively simple and usually very fast because you're hitting the _id
index. In this case, I'd probably go for the normalized version where your posts only contain the id of the place.