문제

이 시나리오가 있다고 말합니다.

Artist ==< Album ==< Track
//ie, One Artist can have many albums, and one album can have many tracks

이 경우 3 개의 엔티티는 기본적으로 동일한 필드를 갖습니다.

  • ID
  • 이름
  • 해당 어린이와의 한 가지 관계의 외국 (아티스트에서 앨범과 앨범 to Track

제공된 솔루션에 대한 일반적인 솔루션은 3 개의 테이블이며, 한 가지 관계 필드에서 동일한 필드 (아티스트, 앨범 등)와 외국의 주요 제약 조건이 있습니다.

그러나이 경우 우리는 같은 필드의 반복을 피하기 위해 상속 형태를 통합 할 수 있습니까? 나는 일종의 무언가를 말하고있다 :

Table: EntityType(EntityTypeID, EntityName)
       This table would hold 3 entities (1. Artist, 2. Album, 3. Track)

Table: Entities(EntityID, Name, RelField, EntityTypeID)
       This table will hold the name of the entity (like the name of 
       an artist for example), the one-many field (foreign-key
       of EntityID) and EntityTypeID holding 1 for Artist, 2 for Album 
       and so on. 

위의 디자인에 대해 어떻게 생각하십니까? 이 DB 시나리오에서 "OOP 개념"을 통합하는 것이 합리적입니까?

마지막으로, 첫 번째 시나리오의 외국 키 제약을 선호하거나보다 일반적인 (예 : 아티스트를 트랙과 연결할 위험이있는 경우, Inputter 이외의 외국 키 값이 실제로 있음을 확인할 수있는 점검이 없기 때문입니다. 앨범) 접근?

..BTW, 생각해 보러 오십시오. 실제로 아티스트의 Relfield의 입력 된 값이 앨범에 해당하는지 확인할 수 있다고 생각합니다.

도움이 되었습니까?

해결책

나는 최근 에이 추상화에 대한이 아이디어가 일관되게 구현 된 것을 보았고, 응용 프로그램과 데이터베이스는 유지 관리 및 문제 해결의 괴물이되었습니다. 나는이 기술에서 멀리 떨어져있을 것이다. 단순하고, 더 좋을수록 내 진언입니다.

다른 팁

다양한 실체에 필연적으로 축적 될 추가 필드가 의무적 일 가능성은 거의 없습니다. 현실을 합리적으로 가까운 방식으로 반영하지 않음으로써 얻을 수있는 것은 없습니다.

나는 당신이 일반적인 OO 디자인에서 이러한 엔티티를 혼란스럽게 할 것이라고 상상하지 않습니다.

이것은 다른 테이블 ( "속성")과 그 사이의 접합 테이블로 단일 테이블 ( "Entity")에서 모든 것을 구현하려는 시도를 한 번 본 시도를 상기시켜줍니다.

세 가지를 모두 함께 붙이면 쿼리를 덜 읽기에 덜 읽고 (세 가지 범주를보기로 분해하지 않는 한) 검색 및 색인을 더 어렵게 만듭니다.

또한, 어느 시점에서 다른 범주에 속성을 추가하려고합니다.이 범주는 다른 범주에 속성이 아닙니다. 세 가지를 모두 함께 붙이면 시스템 덩어리를 찢지 않고 변화의 여지가 없습니다.

당신이 너무 영리 해지지 마십시오.

OOP 방식으로 수행 할 수있는 유일한 장점은 미래에 다른 요소 유형이 추가 된 경우 (즉, 아티스트, 앨범 및 트랙 이외의)입니다. 이 경우 스키마 변경이 필요하지 않습니다.

그러나 나는 Nonop 방식을 선택 하고이 경우 스키마를 변경하는 경향이 있습니다. OOP 솔루션에 포함 된 몇 가지 문제는 다음과 같습니다.

  • 아티스트의 생년월일을 추가하려면 어떻게해야합니까?
  • 앨범과 트랙의 지속 시간을 저장하려면 어떻게해야합니까?
  • 트랙 유형을 저장하려면 어떻게해야합니까?

기본적으로 요소 유형 중 하나 또는 두 개에만 psecific을 저장하려면 어떻게해야합니까?

당신이 이런 종류의 일에 있다면, 테이블 상속을 살펴보십시오. PostgreSQL.

create table Artist (id integer not null primary key, name varchar(50));
create table Album (parent integer foreign key (id) references Artist) inherits (Artist);
create table Track (parent integer foreign key (id) references Album) inherits (Artist);

나는 Le Dorfier에 동의합니다. 기본 엔티티 (ID, 이름)의 개념에서 약간의 재사용을 얻을 수 있지만 그 시점 이외에도 아티스트, 앨범 및 트랙의 개념은 분기됩니다.

그리고 더 현실적인 모델은 아마도 여러 아티스트가 앨범의 단일 트랙에 기여할 수 있다는 사실을 다루어야 할 것입니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top