Treat tables as owned by modules: only the owner writes them and exposes access via its API/facade. Avoid cross-module joins in random places; instead, request data through the owning module or publish domain events. If needed, enforce it with separate schemas, repository boundaries, and code reviews/architecture rules.
Expanding on the short answer — what usually matters in practice:
A tiny example (an explanation template):
// Example: discuss trade-offs for "shared-database-in-a-monolith:-how-do-you-avoid-"
function explain() {
// Start from the core idea:
// Treat tables as owned by modules: only the owner writes them and exposes access via its AP
}