【发布时间】:2017-05-23 18:07:27
【问题描述】:
我正在尝试在 PostgreSQL 中实现审核表设计,其中我有不同类型的用户 ID 可以进行审核。
假设我有一个名为 admins 的表(属于一个组织)和一个名为 superadmins 的表(不属于)。
CREATE TABLE example.organizations (
id SERIAL UNIQUE,
company_name varchar(50) NOT NULL UNIQUE,
phone varchar(20) NOT NULL check (phone ~ '^[0-9]+$')
);
以及潜在的管理设计示例
CREATE TABLE example.admins (
id serial primary_key,
admin_type varchar not null,
#... shared data
check constraint admin_type in ("super_admins", "regular_admins")
);
CREATE TABLE example.regular_admins (
id integer primary key,
admin_type varchar not null default "regular_admins"
organization_id integer references example.organizations(id),
#... other regular admin fields
foreign key (id, admin_type) references example.admins (id, admin_type),
check constraint admin_type = "regular_admins"
);
CREATE TABLE example.super_admins (
id integer primary key,
admin_type varchar not null default "super_admins"
#... other super admin fields
foreign key (id, admin_type) references example.admins (id, admin_type),
check constraint admin_type = "super_admins"
);
现在是一个审计表
CREATE TABLE audit.organizations (
audit_timestamp timestamp not null default now(),
operation text,
admin_id integer primary key,
before jsonb,
after jsonb,
);
这在某种程度上需要继承或多态性,但我很好奇如何设计它。我听说使用 PostgreSQL 的继承功能并不总是一个好方法,尽管我发现它适合这个用例。
我需要能够在更新审计表的触发器中引用单个管理员 ID,如果能够在不使用多个查询的情况下从审计表中选择时获取管理员信息,那就太好了。
使用 PostgreSQL 继承会更好还是有其他我没有考虑过的想法?
【问题讨论】:
标签: postgresql database-design audit-logging