Typically I will not delete the record but will set an Inactive or Deleted bit on the record and exclude those from queries, unless the data is sensitive in nature.
I do this after years of experience of users wanting to retrieve deleted data, even years from when the record was originally deleted.
On larger datasets I'll then have a task run at a specified timeframe that will go through and cleanup/delete all of the Inactive records.
Or it's an error.