2012-11-09 2 views
2

저는 PostgreSQL을 사용하고 있습니다. 서브 테이블의 행에 대한 마스터에 대해 Add/Delete/Update과 같이 대부분 데이터베이스에서 동기화되는 두 개 이상의 테이블이 있어야합니다. 표. 어떻게을 구현하기 위해데이터베이스에서 대부분 동기화되는 두 개 이상의 테이블

트리거가이 상황에서 사용할 수 있는지 잘 모르겠어요

때문에 내 상황에서 서브 테이블이 잘릴 수 있습니다 및 데이터

어떤 생각의 새로운 세트에로드?

예 :

Employee_Sub1: 
id name version 
+------+-------+--------+ 
101 John  1 
102 David 1 
105 Azi  1 

Employee_Sub2: 
id name version 
+------+-------+--------+ 
101 John  1 
102 DavidX 2  <- Sub2 having updated value for id 102 
105 Azi  1 
107 Marry 1 

Employee_Sub3: 
id name version 
+------+-------+--------+ 
101 John 1 
105 Azi  1 
110 devil 1  <- Sub3 having new row of data 

Employee_Final 표는 다음과 같이한다

Employee_Final: 
id name version 
+------+-------+--------+ 
101 John 1 
102 DavidX 2 
105 Azi  1 
107 Marry 1 
110 devil 1 
+2

하나의 가능성은 뷰로 마스터 테이블을 생성하고 서브 테이블에만 실제 데이터를 갖는 것일 수 있습니다. 그러나 이는 뷰에 대한 쿼리가 데이터에 액세스 할 때마다 실행된다는 것을 의미하므로 과도한 조인과 끊임없이 실행되는 쿼리의 경우 확장 가능하지 않을 수 있습니다. – Edu

답변

2

난 당신이 triggers 찾고 생각; PL/PgSQL에서 구현하는 방법은 PL/PgSQL trigger procedures을 참조하십시오. 각각 Employee_Sub1, 및 Employee_Sub3AFTER INSERT OR UPDATE OR DELETE 트리거를 사용하여 변경 내용을 Employee_Final으로 전파하십시오.

이 질문에 대한 느낌이 조금 있지만 table inheritance이지만 상속이 잘 맞는지 확실하지 않습니다.

일반적으로 ID를 변경하는 경우 ON UPDATE CASCADE 외래 키 참조를 사용하지만 역순으로해야하며 FK를 변경할 때 PK가 업데이트되는 곳에서 작동하기 때문에 여기에서는 작동하지 않습니다. 그것은 방아쇠를 당기는 또 다른 직업입니다. NEWOLD 레코드 ID를 비교하고 ID가 변경된 경우 마스터 테이블을 업데이트해야합니다.

+0

내 상황에 서브 테이블이 잘리고 새로운 데이터 세트로로드 될 수 있기 때문에이 상황에서 트리거를 사용할 수 있는지 확실하지 않습니다. 문제의 초기에 강조 표시하지 않으려면 죄송합니다. 방아쇠가없는 어떤 가능성? – Azi

+0

@Azi 'ON TRUCATE'트리거를 사용하여 대처할 수 있습니다. 그렇지 않으면 @Edu가 제안하고 마스터 테이블을보기로 만듭니다. –

0

일반적으로 원본 테이블에 트리거를 만들고 대상 테이블에 업데이트하거나 삽입할지 여부를 결정합니다.

1

테이블 상속을 사용할 수 있습니다. 처음에는 데이터가없는 마스터 테이블을 생성하고 상속 옵션이있는 마스터 테이블에서 하위 테이블을 생성합니다. 마스터 테이블에서 선택하면 결과 테이블에는 자식 테이블의 데이터 집합이 포함됩니다. 방문 http://www.postgresql.org/docs/9.2/static/ddl-inherit.html

+0

답장을 보내 주셔서 감사합니다. 그런데 테이블 상속은 UNION처럼 보이고 id 필드는 기본 키로 설정조차 반복됩니다. 또한 어떻게 삭제 행이 테이블 상속에서 처리되었습니다? – Azi

+0

상속 PK가 없습니다. 데이터 수정은 하위 테이블에서 발생하므로 마스터 테이블에서 선택하면 모든 하위 테이블의 데이터 만 선택됩니다. – KIM

+0

자식 테이블 전체에 걸쳐 ID를 처리하려는 경우 단일 시퀀스를 사용하여 각 자식 테이블이 ID 열의 시퀀스를 공유하도록 할 수 있습니다. 그것은 같다 .... 테이블 tab_name (column_name varchar (1) 기본 nextval ('sequence_name')) 만들기 – KIM

관련 문제