Search code examples
databasedatabase-designaudit

Best design for a changelog / auditing database table?


I need to create a database table to store different changelog/auditing (when something was added, deleted, modified, etc). I don't need to store particularly detailed info, so I was thinking something along the lines of:

  • id (for the event)
  • user that triggered it
  • event name
  • event description
  • timestamp of the event

Am I missing something here? Obviously, I can keep improving the design, although I don't plan on making it complicated (creating other tables for event types or stuff like that is out of the question since it's a complication for my need).


Solution

  • In the project I'm working on, audit log also started from the very minimalistic design, like the one you described:

    event ID
    event date/time
    event type
    user ID
    description
    

    The idea was the same: to keep things simple.

    However, it quickly became obvious that this minimalistic design was not sufficient. The typical audit was boiling down to questions like this:

    Who the heck created/updated/deleted a record 
    with ID=X in the table Foo and when?
    

    So, in order to be able to answer such questions quickly (using SQL), we ended up having two additional columns in the audit table

    object type (or table name)
    object ID
    

    That's when design of our audit log really stabilized (for a few years now).

    Of course, the last "improvement" would work only for tables that had surrogate keys. But guess what? All our tables that are worth auditing do have such a key!