2013-10-31 3 views
0

여러 테이블을 사용하여 관계형 데이터베이스에 대한 Party Model 디자인을 사용하기로 결정했습니다. 하위 객체를 나타냅니다.SQL Party 관계 모델 - Sub와 Super 클래스의 일관성

this postthis one을 가이드로 사용하여 다중 테이블 상속을 사용하여 Party 모델을 구성하기로 결정했습니다. 받는 데이터가 여러 테이블에 분산되어

Parties 
- ID, AUTO_INCREMENT 
- Type 
- Shared_Data 
- Primary Key (ID, Type) 

User_Sub 
- ID 
- Type, Default 'U' 
- User_Data 
- Primary Key (ID, Type) 
- Foreign Key 'User-Party' (ID, Type) references (Parties.ID, Parties.Type) 

Organization_Sub 
- ID 
- Type, Default 'O' 
- Organization_Data 
- Primary Key (ID, Type) 
- Foreign Key 'Organization-Party' (ID, Type) references (Parties.ID, Parties.Type) 

때문에, 나는 읽을 수 있도록하고 싶습니다 업데이트 : 여기

는 기본 내가 (의사 SQL에서) 뭘하는지의 표현입니다 한 번에 부모 및 자식 테이블. 독서는 좋은이며, 수행 할 수 있습니다 :

CREATE VIEW Users as 
SELECT P.*, U.User_Data FROM Parties P 
Inner Join Users_Sub U on P.id=U.id, P.type=U.type 

그러나, 모두에 삽입하는 것은 MySQL은 가능하지 않다 (는 다른 맛이있다?). 그런 식으로 다중 테이블 상속을 수행 할 수 있습니까? 모든 사용자 및 조직 열을 파티 테이블에 넣으면이 문제가 해결 될 수 있지만 꽤 많은 null 필드가 남아 있습니다.

통찰력은 매우 감사하겠습니다.

답변

1

MySQL은 다중 테이블 업데이트와 삭제를 지원하지만 삽입은 지원하지 않습니다. 또한 MySQL은 INSTEAD OF SQL Server와 같은 트리거를 지원하지 않습니다 (다중 테이블 삽입에 대한 한 가지 해결 방법을 제공 할 것입니다).

이 문제를 해결하려면 트랜잭션을 시작하고 파티에 삽입하고 새 ID 값 (LAST_INSERT_ID())을 가져온 다음 하위 테이블에 삽입하는 단일 행 삽입에 대한 저장 프로 시저를 만드는 것이 좋습니다 .

최종 결정은 궁극적으로 다중 행 삽입을 정기적으로 수행해야하는지 여부에 달려 있습니다. 그렇다면 부모 (파티) 테이블에 고유 한 모든 하위 테이블 열도 있고 (nullable), AFTER INSERT 트리거를 사용하여 비 당사자 고유의 열 값을 적절한 위치에있는 새 행에 삽입 할 수 있습니다 자식 테이블.

(저장 프로 시저에서) Parties 테이블을 잠그고, 가장 높은 자동 증가 ID를 변수에 저장하고, 다중 행 파티를 삽입하고, 마지막 테이블을 저장하고, 삽입 된 ID (현재 가장 높은 ID)를 입력 한 다음 ID에 대한 증가 변수 (참여자에서 방금 작성한 ID의 범위와 일치시키기 위해)를 사용하여 행을 해당 하위 테이블에 삽입하십시오.

+0

흠, 모든 해결 방법이있는 것 같습니다. 실제로 다중 테이블 상속이 실제로 발생하지 않습니까? 현재 옵션 중 하나 인 스토어드 프로 시저를 사용하거나 두 개의 쿼리를 수행하는 것만이 유일하게 실행 가능한 것처럼 보입니다. 데이터가 파티 테이블에 존재하지 않기 때문에 트리거를 사용할 수 없습니다. – funseiki

+0

이 관계 유형이 확실히 사용됩니다. 그것은 실제로 네 번째 정규 형식입니다. – udog

+0

일반적으로 단일 테이블 상속으로 구현됩니까? 트리거 제안에 따르면 모든 하위 열이 상위 테이블에 있어야합니다. 그렇게하면 중복성이 생깁니다. 나는 자식 테이블을 모두 제거 할 수 있습니다. 내가 누락 된 것이없는 한. – funseiki