> communicate between apps and sub-apps via the DB
This is an explicit anti-pattern for microservices, since they're now very much not interdependently deploy-able since they all need to be upgraded to work with the new schema (where necessary) then the schema update done, then the new functionality enabled. (Yes, there are many functionalities that can be done with less schema sensitivity, but we're talking about a general case).
The idea of microservices is that they are sufficiently decoupled that they can be updated, potentially hundreds of times per day, without consumers or peers needing to care unless they make use of new functionality.
There are performance drawbacks to high levels of decoupling, so just like database normalisation you break the platonic ideal where your architecture and application require it.