Should I delete or disable a row in a relational database?

Not deleting will create a new class of bugs for all future queries. Don’t forget that query writing is often done by power users (i.e. non-IT professionals), and junior developers. So now every table that has invalid data marked only by a BIT active flag will need an additional AND in the WHERE clause for every query from now until forever. This will help users fall into the pit of failure instead of the pit of success. However, I strongly encourage you to implement these flag systems anyhow because without bad design, there is no need for maintenance developers to fix the numerous bugs it will create.

How valuable is it to have historical data in the table? If the business if forward looking, having old data in the tables can just be a burden– it cause problems when creating constraints (all constraints will have to be modified to exclude data you wish wasn’t there). Data quality assurance is complicated by having to continually re-identify what is “old crap we are afraid to delete but never want to ever use or update again” and new stuff we care about.

Is it being deleted because it was a mistake? If the row corresponds to an entity in real life, maybe it is interesting to keep and set a “vaporized”, “dead”, “left the building” flag. If you accidentally inserted a row that corresponds to no entity in real life, a DELETE is not a bad thing. Are imaginary customers that never existed important to keep in the customer table?

And finally, personality plays a big role. People can be packrats with data, too. If a DBA keeps all his newspapers from 30 years back and don’t like deleting data, maybe he should make sure he’s making data design decisions based on the merits and not an irrelevant personal preference.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)