Append-only version table for product_route. Carries the routing
decision: which vendor handles the route, the structured matcher that
gates when this version applies, and the vendor's fee for THIS route —
vendors charge different things per route, so the fee is per-route, not
shared vendor state. Per-vendor limits stay on product_vendor; the fee
is deliberately NOT part of the route's identity tuple (productId, vendorId, matcherHash) — one vendor can't hold two routes identical
except for the fee.
Every change to vendor or matcher inserts a new row and the identity
table's currentVersionId is repointed in the same transaction. UPDATE
and DELETE are blocked by the product_route_version_immutable trigger.
No externalId — only the identity row is externally addressable.
Append-only version table for
product_route. Carries the routing decision: which vendor handles the route, the structured matcher that gates when this version applies, and the vendor's fee for THIS route — vendors charge different things per route, so the fee is per-route, not shared vendor state. Per-vendor limits stay onproduct_vendor; the fee is deliberately NOT part of the route's identity tuple (productId, vendorId, matcherHash) — one vendor can't hold two routes identical except for the fee.Every change to vendor or matcher inserts a new row and the identity table's
currentVersionIdis repointed in the same transaction. UPDATE and DELETE are blocked by theproduct_route_version_immutabletrigger.No
externalId— only the identity row is externally addressable.