Every conversation about personal data stalls in the same place: nobody can say which tables hold it. The inventory is not documentation produced at the end, it is the thing everything else depends on.
table.column category basis retention
-----------------------------------------------------------------
users.email identifier contract account life
users.phone identifier consent account life
orders.shipping_address contact contract 7 years (tax)
audit_log.actor_email identifier legit. int. 90 days
jobs.payload *derived* varies 7 days
logs-*.request.body *accidental* none 30 days
The last two rows are why the exercise is worth doing: personal data in a queue payload and in a log index is data nobody chose to store and everybody has. Grepping the schema for likely column names finds the first eighty percent in an afternoon; the rest comes from reading what actually gets written. Keeping it in the repository next to the migrations means it is reviewed when a column is added rather than rediscovered annually.