2017-05-23 2 views
0

J'essaie d'implémenter une conception de table d'audit dans PostgreSQL, où j'ai différents types d'ID utilisateur qui peuvent être audités.Conception de table d'audit PostgreSQL avec plusieurs "Types d'utilisateurs"

Disons que j'ai une table nommée admins (qui appartiennent à une organisation), et une table Superadmins (qui ne le font pas).

CREATE TABLE example.organizations (
    id SERIAL UNIQUE, 
    company_name varchar(50) NOT NULL UNIQUE, 
    phone varchar(20) NOT NULL check (phone ~ '^[0-9]+$') 
); 

et un exemple de conception d'administration potentiel

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" 
); 

maintenant une table de vérification

CREATE TABLE audit.organizations (
    audit_timestamp timestamp not null default now(), 
    operation text, 
    admin_id integer primary key, 
    before jsonb, 
    after jsonb, 
); 

Cela nécessite l'héritage ou polymorphisme à un certain niveau, mais je suis curieux de savoir comment pour le concevoir. J'ai entendu dire que l'utilisation de la fonctionnalité d'héritage de PostgreSQL ™ n'est pas toujours une bonne solution, bien que je la trouve adaptée à ce cas d'utilisation. Je devrai être capable de référencer un seul ID administrateur dans le déclencheur qui met à jour la table d'audit, et il serait bien de pouvoir obtenir les informations d'administration lors de la sélection dans la table d'audit sans utiliser plusieurs requêtes.

Serait-il préférable d'utiliser l'héritage PostgreSQL ou existe-t-il d'autres idées que je n'ai pas envisagées?

Répondre

0

Je ne dirais pas que cela appelle un héritage ou un polymorphisme. Les administrateurs et superadmins sont les deux types d'utilisateurs, dont la seule différence est que les premiers appartiennent à une organisation. Vous pouvez le représenter avec une seule table et une clé étrangère Nullable. Pas besoin de compliquer les choses. Surtout si vous utilisez un serial comme type de clé primaire: de mauvaises choses se produisent si vous confondez admin # 2 pour superadmin # 2.

+0

Peut-être que l'exemple est incomplet, mais appartenir à une organisation n'est pas la seule différence, juste une grande différence. En outre, je suis dans le camp qu'une clé étrangère nullable est une mauvaise idée dans cet exemple. (Différence entre une valeur inconnue et une valeur inconnue.) Je vais mettre à jour l'exemple avec un exemple de table d'administration parente et mettre en cascade les modifications dans les colonnes d'exemple super_admins et regular_admins (ce qui est en partie ce que je demande à propos de). –