A new column starts with definition. Choose a name that survives refactoring. Use a data type that fits the smallest reliable unit you need. Be explicit about nullability. Set defaults when possible. These small decisions prevent silent failures later.
Performance comes next. Every column adds to storage and indexing overhead. If the column is part of a frequent filter, add an index. If it’s part of a large join, test the execution plan before and after the change. Avoid indexing high‑cardinality text unless search is the core use case.
Migration strategy matters. In production, never block writes for longer than necessary. Use tools that allow online migrations. Split large updates into batches. Disable triggers that are not needed during the migration to avoid cascading delays.