Templates
Data dictionary example, with a free template you can copy
A data dictionary lists the tables and columns in a database with what each one means, what values it holds, how it joins to other tables and who owns it. Below is a worked example for a small orders database, then a blank template you can download.
What each column in the template is for
- Table and column: exactly as they appear in the database.
- Business name: what people call it in meetings.
- Meaning: one or two plain sentences that don't just restate the column name.
- Grain and unit: what one row represents, and the unit of the value (rupees, paise, minutes, units).
- Allowed values: for codes and flags, what each value means.
- % null: from profiling. A high number usually means the column is optional, abandoned or misused.
- Key and join: primary key, declared foreign key or inferred join, and what it joins to.
- Join evidence: for an inferred join, the share of values that match.
- Business rules: filters and exclusions that apply whenever this column feeds a reported number.
- Sensitive data: whether it holds personal data.
- Owner and last reviewed: who approved the meaning, and when.
The last few columns are the ones most templates leave out. They're also what an AI agent needs to use the dictionary safely.
Worked example: a small orders database
| Table | Column | Business name | Meaning | Grain / unit | Allowed values | % null | Key and join | Join evidence | Business rules | Sensitive | Owner, reviewed |
|---|---|---|---|---|---|---|---|---|---|---|---|
| orders | order_id | Order number | Unique ID for a customer order | One row per order | 0 | Primary key | No | Sales ops, Oct 2026 | |||
| orders | status | Order status | Where the order is in fulfilment | Code | 1 placed · 2 paid · 4 dispatched · 9 cancelled by customer | 0.2 | Exclude 9 from revenue | No | Sales ops, Oct 2026 | ||
| orders | booked_at | Booking date | When the customer placed the order, in IST | Timestamp | 0 | Financial year starts 1 April | No | Finance, Oct 2026 | |||
| orders | channel | Sales channel | Where the order came from | Code | web · app · store · internal | 0 | Exclude internal from revenue | No | Sales ops, Oct 2026 | ||
| order_lines | amount_paise | Line amount | Price charged for the line, before refunds | Paise | 0 | Divide by 100 for rupees | No | Finance, Oct 2026 | |||
| customers | is_test | Test account | Accounts created by staff for testing | Flag | true · false | 0 | Exclude true from all customer counts | No | Engineering, Oct 2026 | ||
| customers | phone | Mobile number | Customer's contact number | Text | 12.4 | Yes, personal data | Engineering, Oct 2026 | ||||
| shipments | order_ref | Order reference | The order this shipment fulfils | One row per shipment | 0.8 | Inferred join to orders.order_ref | 98.6% of values match | No | Logistics, proposed, not yet approved |
The last row is the honest one. The join looks right, but nobody has approved it yet, and the dictionary says so.
Mistakes that make a data dictionary useless
- Meanings that restate the column name ("customer_id: the ID of the customer").
- No owner, so nobody can say whether a meaning is still true.
- No join information, which leaves readers guessing at exactly the thing they came for.
- Codes listed without their meanings.
- A single "last updated" date for the whole document instead of one per row.
Download the template
The template is a CSV with every column above and the worked example as sample rows. Open it in Excel or Google Sheets and replace the sample rows with your own.
Download data-dictionary-template.csv
Rather not fill it in by hand?
Antcluster connects read-only to your database and drafts this dictionary for you, then your engineers review it. You can ask questions of the database before the dictionary is finished, the unwritten meanings get proposed with their evidence, and once tables are connected you can look for relationships nobody had mapped. Coding agents got better at large codebases partly because code carries structure they can check, and a reviewed dictionary gives your data the same. Every approval feeds the next question, so the dictionary keeps improving as people use it.