Most systems store created_by on almost every table. I removed it almost completely.
At some point, I realised I was doing the same thing everywhere without really knowing why or questioning it. It felt like one of those “standard practices” you inherit without thinking too deeply about. But the more I worked on the system, the more it started to feel wrong. Well, not obviously wrong per se, but subtly useless.
The idea behind created_by fields is straightforward:
It’s simple, cheap, and seems harmless, like a miniature audit detail right there in the record. In some cases it is even necessary:
purchase_order.created_bypurchase_order.approved_byThose fields carry meaning. They are part of the business process.
But then you start seeing it everywhere; that’s where things start to break down.
The issue with created_by isn’t that it exists, it’s that it pretends to answer a question it actually can’t answer well:
“Who did what?”
Let’s say you have:
inventory_item.created_by = user_1_id
What does that really tell you? That user_1 created it… at some point, but that’s all.
It doesn’t tell you: