0

시작한 프로젝트에 대해 MySQL 데이터베이스를 디자인하려고하지만 최선의 방법을 찾을 수 없습니다.부모 자식 관계가있는 여러 데이터 형식의 저장소 모델링

데이터베이스에 저장해야하는 다양한 유형의 개체가 포함 된 OOP 시스템입니다. 그러나 이러한 객체는 부모 자식 관계를 서로 유지해야합니다. 또한 시스템이 생산되면 새로운 데이터 유형을 쉽게 추가 할 수있는 유연성이 필요합니다.

필자가 볼 수있는 한 3 가지 옵션이 있습니다. 하나는 순수 관계형이고, 하나는 엔티티 속성 값 (EAV를 제대로 이해하지 못합니다)이고 마지막은 생각한 하이브리드 디자인입니다. 그러나 나는 이전에 이미 생각해 왔으며 적절한 이름을 가지고 있다고 가정합니다.

관계형 디자인은 모든 유형의 객체를 저장할 수있는 열이있는 하나의 큰 테이블과 첫 번째 테이블에서 행의 상위 하위 관계를 유지 관리하는 두 번째 테이블로 구성됩니다.

EAV 디자인은 세 개의 열 (엔티티 ID, 속성 및 값)을 가진 EAV 테이블 인 두 개의 테이블을 가지므로 두 번째 테이블은 이러한 엔티티의 부모 하위 관계를 연결합니다.

하이브리드 디자인에는 개체의 각 유형에 대한 테이블이 있고 부모, 자식 및이 ID의 출처가되는 테이블의 식별자를 저장해야하는 부모 자식 관계 테이블이 있습니다.

나는이 문제가 이전에 수 백 번 해결되어 왔으며 해결 방법에 대해 읽을 수 있도록 참고 자료를 제공해 주시면 감사하겠습니다.

+0

EAV를 사용하지 마십시오.테이블 상속에 대한 정보 http://martinfowler.com/eaaCatalog/singleTableInheritance.html –

답변

0

예, EAV 디자인을 잘 사용할 수 있습니다. 약 3 년의 세밀한 작업 후에도 우리가 만든 응용 프로그램에서 작동합니다. 일반 테이블 구조를 사용하고 개체 그룹에 특정 테이블을 사용할 수도 있습니다. 또는 각 개체에 대해 하나의 일반 테이블을 만듭니다. 어떤 개체가 메타 데이터 리포지토리의 일부인 테이블. val_int, val_string 유형의 구조를 사용하는 경우 값이 저장되는 곳을 제외한 Null 열을 갖게됩니다. 사용을 고려할 수도있는 MS SQL의 희소 행렬 기능이 있습니다. 디스크 크기는 요즘 다소 저렴합니다. 따라서 전통적인 구조에 대한 단점은 N 행 대신 NxR 행 (오브젝트에 대한 R 속성이라고 함)입니다. 그 외에는

, 객체 인스턴스의 GUID를, 동적 SQL 세대가에 대한 몇 가지

1

이 유일한 진정한 관계형 디자인 ... 피려 :

CREATE TABLE Objects (
    object_id INT AUTO_INCREMENT PRIMARY KEY, 
    parent_object_id INT, 
    -- also attribute columns common to all object types 
    FOREIGN KEY (parent_object_id) REFRENCES Objects (object_id) 
); 

CREATE TABLE RedObjects (
    object_id INT PRIMARY KEY, 
    -- attribute columns for red objects 
    FOREIGN KEY (object_id) REFRENCES Objects (object_id) 
); 

CREATE TABLE BlueObjects (
    object_id INT PRIMARY KEY, 
    -- attribute columns for blue objects 
    FOREIGN KEY (object_id) REFRENCES Objects (object_id) 
); 

CREATE TABLE YellowObjects (
    object_id INT PRIMARY KEY, 
    -- attribute columns for yellow objects 
    FOREIGN KEY (object_id) REFRENCES Objects (object_id) 
); 

는하지만 MySQL은 재귀 지원하지 않습니다 예를 들어 전체 트리를 가져 오기 위해 복잡한 쿼리를 수행해야하는 경우 다른 방법을 사용하여 관계를 저장해야합니다.

+0

[동일한 테이블 (클로저 테이블 패턴)을 가리키는 2 튜플 복합 FK 쌍] (http : // dba. stackexchange.com/questions/51764/pair-of-2-tuple-composite-fks-pointing-to-same-table-closure-table-pattern). 내 답변이 맞는지 아니면 '업데이트 캐스케이드'문제에 대한 해결책이 있는지 궁금합니다. –

+0

@ypercube, 물론, 그 답변을 추가했습니다. –