Database design for audit logging

前端 未结 5 1540
孤独总比滥情好
孤独总比滥情好 2020-11-30 16:08

Every time I need to design a new database I spend quite some time thinking on how I should set up the database schema to keep an audit log of the changes.

Some ques

5条回答
  •  再見小時候
    2020-11-30 16:49

    We’ll create a small example database for a blogging application. Two tables are required:

    blog: stores a unique post ID, the title, content, and a deleted flag. audit: stores a basic set of historical changes with a record ID, the blog post ID, the change type (NEW, EDIT or DELETE) and the date/time of that change. The following SQL creates the blog and indexes the deleted column:

    CREATE TABLE `blog` (
        `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
        `title` text,
        `content` text,
        `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
        PRIMARY KEY (`id`),
        KEY `ix_deleted` (`deleted`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Blog posts';
    

    The following SQL creates the audit table. All columns are indexed and a foreign key is defined for audit.blog_id which references blog.id. Therefore, when we physically DELETE a blog entry, it’s full audit history is also removed.

    CREATE TABLE `audit` (
        `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
        `blog_id` mediumint(8) unsigned NOT NULL,
        `changetype` enum('NEW','EDIT','DELETE') NOT NULL,
        `changetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY (`id`),
        KEY `ix_blog_id` (`blog_id`),
        KEY `ix_changetype` (`changetype`),
        KEY `ix_changetime` (`changetime`),
        CONSTRAINT `FK_audit_blog_id` FOREIGN KEY (`blog_id`) REFERENCES `blog` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    

提交回复
热议问题