This post explains how `Object`, `Property`, and `Relation` work together
to define the platform schema and graph behavior.

## The mental model

- `Object` defines a data type (for example `candidate`, `vacancy`)
- `Property` defines reusable field definitions attached to objects
- `Relation` defines links between objects
- `Record` (data) then stores values that follow that schema


Think of this as schema-first graph modeling: objects shape records, properties
shape values, and relations shape connectivity.

## Object: schema root

`Object` contains naming, grouping, traits, and schema relationships.

## Property: field definition + object relationship metadata

`Property` is not just a key name. It also includes:

- validation-related rules (`required`, `unique`, format/type rules)
- options and format settings serialization
- per-object relationship metadata (group, hidden, index)
- index lifecycle (`indexed` creates/drops DB indexes)


## Relation: graph connector between objects

`Relation` stores relations and drives object-level graph edges.

At record level, relation endpoints in `RecordController` use relation names to
connect actual records through this schema.

## Design guidelines

- Keep object names stable and lowercased.
- Reuse properties intentionally; avoid creating near-duplicates.
- Use relation names that clearly describe business meaning.
- Plan indexed properties for real query/filter needs, not by default.


## Related reading

- [Create and share properties](/blog/2026-06-07-create-and-share-properties)
- [Save records](/blog/2026-03-25-save-records)