Naming Columns by Type
What good names look like for each data type, with example sets for a typical table.
Identity columns
Use id for a simple surrogate key, or <table>_id when joins should stay unambiguous. UUID keys read well as user_uuid. Whatever you choose, foreign keys referencing it must use the identical name.
Boolean columns
Prefix with is_, has_, or can_ so the name reads as a yes/no question: is_active, is_verified, has_children, can_edit, allow_notifications. A bare active or deleted forces every reader to check the type first.
Timestamp columns
The _at suffix marks instants: created_at, updated_at, published_at, expires_at, last_login_at. Calendar dates get _date: birth_date, start_date. The soft-delete standard is deleted_at with NULL meaning active.
Text and descriptive columns
Singular nouns, qualified only when needed: first_name, email, phone_number, description, notes, slug, locale. URLs get _url (avatar_url); codes get _code (country_code).
Numeric columns
Name the thing being measured: total_amount, unit_price, quantity, tax_rate, discount_pct, view_count, sort_order. Avoid bare total, value, amount — total of what?
A full example: an orders table
| Column | Type | Why it works |
|---|---|---|
order_id | primary key | Unambiguous in joins |
customer_id | foreign key | Matches the customers PK name |
order_status | text | Qualified — not bare status |
total_amount | numeric | Says what is summed |
is_paid | boolean | Reads as yes/no |
created_at | timestamp | Standard _at suffix |
deleted_at | timestamp | Soft delete; NULL = active |
Generate a set like this for your own table with the free database column name generator — enter the table name, pick Mixed, and curate the shortlist.