【问题标题】:PostgreSQL audit table design with Multiple "User types"具有多种“用户类型”的 PostgreSQL 审计表设计
【发布时间】: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


    【解决方案1】:

    我不会说它需要继承或多态性。管理员和超级管理员都是用户类型,唯一的区别是前者属于一个组织。您可以用一个表和一个可为空的外键来表示它。没有必要把事情复杂化。特别是如果您使用 serial 作为主键类型:如果您将 admin #2 与 superadmin #2 混淆,就会发生坏事。

    【讨论】:

    • 也许这个例子不完整,但属于一个组织并不是唯一的区别,只是一个很大的区别。另外,我认为在这个例子中一个可以为空的外键是一个坏主意。 (不知道的值和没有值之间的区别。)我将使用示例父管理表更新示例,并级联示例 super_admins 和 regular_admins id 列中的更改(这部分是我要问的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2014-01-19
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多