2011-03-27 4 views
0

PostgreSQL 프로젝트의 스키마를 만드는 데 문제가 있습니다.SQL 스키마 (postgresql) 만들기

프로필이 있고 각 프로필이 일반, 교육 및 고용 프로필의 세 가지 유형으로 제공되므로 소셜 네트워킹 사이트 용입니다. 따라서 각 프로필마다 다른 속성이 필요합니다.이 모든 것을 한 테이블에서 어떻게 수행합니까? ?

create type ProfileTypeValue as enum 
    ('generic', 'education', 'employment'); 

create Profiles (
    id integer 
    type ProfileTypeValue 
    ....? 
    primary key (id) 
); 

는 교육 프로파일이 있다면 예를 들어, 우리는 기관 이름 등을 가지고하거나 고용 프로파일 인 경우에, 우리는

그것을인가 등, 고용주 이름 속성을 가질 필요가 필요가 있기 때문에 가장 좋은 3 개의 테이블, 각 프로필 유형에 대해 1, 그게 가능한지 모르겠지만 ... 나는 그것이 프로필의 경우 이러한 성명을 포함하거나 프로파일의 경우 이러한 속성을 포함하는 경우 if 문을 가지고 있어야한다고 생각합니다.

답변

3

여기에 몇 가지 옵션이 있습니다.

  1. 공통 프로파일은 하나 개의 테이블 공통 프로파일 테이블에 외래 키 참조
  2. 상속
  3. 키 - 값 저장소
와 자신의 테이블에서 특정 프로파일 유형에 속성을 같은 테이블의 모든이 옵션에서 같은 테이블

에서

모든 모든 필드는 항상 프로필이 어떤 종류 존재한다. 모든 열을 나열하면되므로 처음 시작하기가 너무 쉽습니다. 그러나 이것은 유지 보수성과 확장 성이 떨어지기 때문에 장기적으로 삶을 더 어렵게 만드는 나쁜 디자인입니다. 데이터베이스 정규 양식 등을 읽어야합니다. 그렇게하지 마십시오. 자신의 테이블이 옵션은 모든 프로파일에 대해 테이블을 만듭니다에서

마스터 프로파일 테이블 및 프로파일 유형에 의존 세부 사항. 여기에는 모든 공통 속성이 포함됩니다. 이 테이블은 식별자가 모두 동일한 네임 스페이스에 있고 각 프로필에 고유 한 ID가 있는지 확인합니다. 각 프로필 유형에 대해 마스터 프로필 테이블에 대한 외래 키 참조가있는 새 테이블을 만듭니다. 그런 다음 고용 프로파일 테이블과 마스터 프로파일 테이블에 대한 내부 결합을 사용하여 모든 고용 프로파일을 선택할 수 있습니다. 이 디자인을 사용하면 각 프로파일 유형에 대한 제한 조건을 작성할 수 있습니다. 또한,이 디자인은 고용 프로파일과 교육 프로파일 모두를 가질 수있게합니다. 당신은 아마 이것을해야합니다.

상속

Postges 테이블 상속을위한 기능을 제공합니다. 모든 프로파일 유형에 대한 기본 테이블을 작성한 다음 각 프로파일 유형에 대한 하위 테이블을 작성하여이를 사용할 수 있습니다. 각 프로파일 유형은 상위 테이블에 정의 된 모든 속성을 상속합니다. 상속을 사용하면 고용 테이블을 사용하여 상위 테이블과 모든 고용 프로파일을 사용하여 모든 프로파일을 선택할 수 있습니다. 일반 프로파일이 공통 속성 만 사용하는 경우, 이들을 상위 테이블에 저장할 수 있습니다.

포스트그레스에서 상속의 주된 단점은 상위 테이블과 하위 테이블이 동일한 네임 스페이스를 공유하지 않는다는 것입니다. 모든 테이블에 걸친 고유 제한 조건을 작성할 수 없습니다.즉, 식별자가 다른 방식으로 전역 적으로 고유해야합니다. 프로필 식별자에 대한 별도의 테이블을 유지합니다.

상황에 따라 상속의 단점이 중요한지 생각해보십시오. 그러나 공통 속성의 정의를 복제 할 필요가 없으므로 포스트그레스를 사용하는 경우 모든 프로필 유형에 대해 별도의 테이블을 수행하는 것이 현명한 방법입니다.

키 - 값 또한 일반적인 프로필 속성 테이블을 만들고 (프로필, 속성, 값) -tuples에 attribues의 나머지 부분을 유지할 수

가게. 이렇게하면 RDBMS의 이점을 버리고 프로그램의 모든 논리를 구현해야합니다. 이러지 마.

+2

+1, 아주 좋은 답변입니다. 개인적으로 옵션 2로 갈 것입니다. 옵션 3은 Postgres에서'hstore' 데이터 타입을 사용하여 매우 효율적이고 또한 색인을 생성 할 수 있습니다. –

+0

주석에 오타가 있음 : hstore는 옵션 4 (키 - 값 저장소) 용입니다. http://www.postgresql.org/docs/9.0/static/hstore.html. –

+0

@Aleski : 당신 말이 맞아요. 감사 –

1

PostgreSQL은 테이블 레벨 상속을 지원합니다. 프로필 테이블을 공통 속성을 가진 부모 테이블로 만들 수 있습니다. 그런 다음 해당 카테고리와 관련된 속성 만 사용하여 교육 및 고용을위한 자식 테이블을 분리 할 수 ​​있습니다.

PostgreSQL 설명서 here을 확인하십시오.