1. Catalog
One row per canonical amenity, equipment, or appliance. It has kind, name, and provider mappings.
The catalog owns what the amenity is. Property, building, category, and unit layers own what is true locally.
catalogId.
One row per canonical amenity, equipment, or appliance. It has kind, name, and provider mappings.
Existing JSONB arrays stay. Items keep local fields like location, brand, notes, status, and instructions.
Layer items store catalogId. They no longer store name or kind.
Child layers override only filled fields. They can also suppress an inherited item locally.
Today, amenities are often stored like thin tags or true/false fields. Sometimes extra text exists, but identity and local details are mixed together, so it is hard to trust, edit, or map consistently.
Useful for checklists, but not enough for operations, guest instructions, provider mapping, or unit-specific overrides.
{
"wifi": true
}
The catalog says this is WiFi. The property or unit stores the useful local facts around that same canonical item.
{
"catalogId": 42,
"location": "living room",
"brand": "TP-Link",
"instructions": ["Password is on the fridge"],
"status": "operational",
"notes": "Router restarts nightly"
}
equipment_amenity_catalog.{kind,name} with catalogId.kind, name, and provider mappings.catalogId.catalogResourceId or numeric catalogId?