Verified against Semitexa Ultimate 2026.09.19.1020
Shared Table Extension
Two ResourceModel classes in different modules can target the same physical table with #[FromTable]. The SchemaCollector merges their column sets into one schema plan.
How it works
The base module defines the core resource with #[FromTable('products')] and declares its columns. A later module creates its own resource, also pointing at #[FromTable('products')], and declares only its additional columns. At sync time, SchemaCollector groups all discovered resources by table name and only adds missing columns — it never redefines existing ones. Neither module needs to open or modify the other's class.
Why this matters
Without shared table extension, a later module either has to edit the original resource class (creating cross-module ownership bleed) or maintain a separate table (creating join complexity). The additive model keeps module boundaries clean and schema evolution safe.