2017-05-23 12 views
0

감사 할 수있는 사용자 ID가 다른 PostgreSQL에서 Audit 테이블 디자인을 구현하려고합니다. "User types"가 여러 개인 PostgreSQL 감사 테이블 디자인

는이 전 (조직에 속하는) 관리자라는 이름의 테이블이 있다고 가정 해 봅시다, 테이블 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 상속을 사용하는 것이 더 좋을까요, 아니면 제가 고려하지 않은 다른 아이디어가 있습니까?

답변

0

나는 그것이 상속이나 다형성을 요구한다고 말하지 않을 것이다. 관리자와 수퍼 관리자는 두 가지 유형의 사용자로, 이전의 조직과 다른 점만 다릅니다. 단일 테이블 W 널 (NULL) 입력 가능 외부 키로이를 표현할 수 있습니다. 문제를 지나치게 복잡하게 만들 필요가 없습니다. 특히 기본 키 유형으로 serial을 사용하는 경우 관리자 # 2를 수퍼 관리자 # 2와 혼동하면 나쁜 일이 발생합니다.

+0

아마도이 예는 불완전하지만 조직에 속한 것이 유일한 차이점이 아니라 큰 차이 일 것입니다. 또한이 캠프에서는 null 허용 가능 외래 키가 좋지 않다고 생각합니다. (알려지지 않은 값과 값을 가지지 않는 것의 차이) 예제를 부모 관리 테이블의 예제로 업데이트하고 예제 super_admins 및 regular_admins id 열의 변경 사항을 계단식으로 작성합니다 (일부는 제가 묻는 것입니다).). –