我正在尝试在PostgreSQL中实现一个Audit表设计,我可以在其中审核不同类型的用户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的继承功能并不总是很好的方法,虽然我发现它适合这个用例。
我需要能够在更新审计表的触发器中引用单个管理员标识,并且能够在不使用多个查询的情况下从审计表中进行选择时获取管理员信息会很好。
使用PostgreSQL继承是否更好?还是有其他想法我没有考虑过?
答案 0 :(得分:0)
我不会说它要求继承或多态。管理员和超级用户都是用户类型,其区别仅在于前者属于某个组织。您可以使用单个表和可以为空的外键来表示它。不需要使问题复杂化。特别是如果您使用serial
作为主键类型:如果您将管理员#2与superadmin#2混淆,则会发生不好的事情。