2008-09-28 5 views
1

각 필드에는 고유 한 필드가있는 여러 유형의 엔티티가 있으며 각각 별도의 테이블에 저장됩니다.
이러한 테이블의 각 레코드는 다른 테이블의 0 개 이상의 레코드에 연결될 수 있습니다. 즉, 다른 엔터티 형식의 레코드에 연결될 수 있습니다.
룩업 테이블을 사용하면 초기화해야하는 (m (m-1))/2 = O (m^2) 개의 개별 조회 테이블을 얻습니다.
6 개 또는 7 개의 다른 엔티티 유형이 여전히 가능하지만 50 개 이상의 유형에도 여전히 관련이 있습니까?
특히, 주어진 레코드는 대부분의 다른 엔티티 유형에 대한 링크를 가져야하므로 이론적으로 말하면 거의 완성되지 않은 비 지향적 인 n 측면 그래프를 처리하게됩니다.
누구든지 관계형 DBMS에이 구조체를 저장하는 방법에 대해 설명 할 수 있습니까?
(나는 중요하다면 PostgreSQL을 사용하고 있지만 다른 DBMS에 대한 해결책은 똑같이 도움이 될 것입니다).
감사합니다.RDBMS에 전체 그래프 저장

Yuval 교수

답변

2

이 객체 관계형 매핑, 고전적인 어려운 문제입니다. 이 작업을 제대로 수행하려면 ORM 도구가 정말로 필요합니다. 그렇지 않으면 견딜 수 없을 것입니다.

당신이 참조하는 연결 문제는 함정 중 하나이며 매우 조심스럽게 최적화 및 쿼리 조정이 필요합니다. 그렇지 않으면 성능이 저하됩니다 (예 : N + 1 SELECT 문제).

응용 프로그램 플랫폼이 무엇인지 알지 못하면 더 이상 구체적이지 않습니다. 사용 된 실제 DBMS는 실제로 문제와 관련이 없습니다.

0

다른 옵션은 Object Oriented Database (예 : db40 또는 Cache)을 사용하는 것입니다. 성능이 큰 문제가 아니며 전체 개체 그래프를 저장하기로 결정한 경우이를 조사 할 수 있습니다.

2

모든 엔티티 유형에 공통 기본 유형을 사용할 수 있으며 해당 기본 유형을 통한 관계를 처리 할 수 ​​있습니다. 이는 사실상 모든 ORM 도구가 판별 자 열과 외래 키 관계를 사용하여 수행 할 수있는 작업입니다 (CLSA, 그래도).

이 방법을 사용하면 하나의 관계 테이블 만 남게됩니다.

편집 : 이이 설정 방법은 다음과 같습니다

CREATE TABLE base (
    id int(10) unsigned NOT NULL auto_increment, 
    type enum('type1','type2') NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE type1 (
    id int(10) unsigned NOT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT FK_type1_1 FOREIGN KEY (id) REFERENCES base (id) 
); 

CREATE TABLE type2 (
    id int(10) unsigned NOT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT FK_type2_1 FOREIGN KEY (id) REFERENCES base (id) 
); 


CREATE TABLE x_relations (
    from_id int(10) unsigned NOT NULL, 
    to_id int(10) unsigned NOT NULL, 
    PRIMARY KEY (from_id,to_id), 
    KEY FK_x_relations_2 (to_id), 
    CONSTRAINT FK_x_relations_1 FOREIGN KEY (from_id) REFERENCES base (id), 
    CONSTRAINT FK_x_relations_2 FOREIGN KEY (to_id) REFERENCES base (id) 
    ON DELETE CASCADE ON UPDATE CASCADE 
); 

참고하여 ORM 솔루션 행 (type1 또는 type2)에 대한 올바른 하위 유형을 찾는 데 도움이됩니다 판별 열 (type). ORM 문서에는 다형성을 기본 테이블과 매핑하는 방법에 대한 섹션이 있어야합니다.

+0

그리고 여전히 다른 엔티티 테이블을 유지할 수 있습니까? 아니면 어떻게 든 모든 속성을 단일 테이블에 맞출 필요가 있습니까? 여기 조금 혼란 스럽네 ... – Yuval