Database standards
Naming, migrations, keys and the rules we hold each other to in review.
Development standardUpdated 21 days ago (29 Sept 2026) by Developer B
Database standards
How we build in this area. Deviations are fine, but say why in the pull request.
Naming
- Tables are singular:
member,skill,assessment. - Primary key is always
id. - Foreign keys are
<table>_id. - Timestamps are
created_at/updated_at. - Booleans read as a statement:
is_primary,archived.
Keys
- Use a generated id (cuid) as the primary key. Do not make a natural key the primary key — emails and names change.
- Put a unique constraint on anything that must be unique anyway, such as
(member_id, skill_id).
Migrations
- Every schema change ships as a migration. No manual edits to a live database.
- A migration must be safe to run while the old code is still serving:
- add the column as nullable,
- backfill,
- make it required in a later migration.
- Never rename and reuse a column in one step.
Queries
- No N+1. If you are querying inside a loop, stop and write a join.
- Always know what your
WHEREclause matches before anUPDATEorDELETE. - Index foreign keys and anything you filter or sort by regularly.
- Measure before and after adding an index. An index is not free — it costs on every write.
Transactions
- Wrap multi-statement writes that must succeed or fail together.
- Keep transactions short. Never hold one open across a network call.
Review checklist
- Migration is reversible, or the risk is stated
- New foreign keys are indexed
- No query inside a loop
- Deletes are either soft or have a considered cascade
- The query plan was checked for anything on a hot path