Because your mental model of a project will change, ingrain identified constraints as deep in the system as possible. In a Rails context: it's nice to have ActiveRecord validations, but push checks down into the database via check constraints and constraint triggers so bad data cannot enter at the lowest level. Complements rejecting invalid input as soon as it arrives at the system boundary.