0

는이 전복합 키, 외래 키

TABLE subgroups (
    group_id  t_group_id NOT NULL REFERENCES groups(group_id), 
    subgroup_name t_subgroup_name NOT NULL, 
    more attributes ... 
) 
  • subgroup_namegroup(group_id)에 고유 한 다음과 같은 테이블이 있다고 가정 해 봅시다.
  • group은 많은 subgroups을 가질 수 있습니다.
  • subgroup_names은 사용자가 제공 한 것입니다. (나는 subgroup_id 컬럼을 사용하는 것을 피하고 싶다 .은 모델에서 의미를 가지며 단순한 레이블 이상이다. 나는 미리 정해진 이름의 목록을 제공하고 있지만 사용자가 유연성을 위해 자신의 것을 추가 할 수 있도록 허용한다.)
  • 이 테이블에는 하위 그룹 속성 (다 대일 관계가 있음)을 포함하는 참조 수준 하위 테이블이 2 개 있습니다.


나는에 PRIMARY KEY하고 싶은 (GROUP_ID을, 상단 (트림 (subgroup_name)));

내가 아는 바로는 postgres는 PRIMARY KEY/UNIQUE를 함수에 사용할 수 없습니다. IIRC에서 관계형 모델은 열을 저장된 것으로 사용해야합니다.

CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name))); 내 모델의 다른 테이블에 두 개의 열을 가리키는 외부 키가 있으므로이 문제를 해결할 수 없습니다.


두 가지 옵션이 있습니다.

옵션 A)

  • 스토어 subgroup_name
  • 의 정리 하위 그룹 이름은 세척 할 문자열

옵션 B)

    를 포함 할 여분의 열라고 subgroup_name_raw 추가
  • 내 키 쌍에 고유 인덱스와 기본 키를 모두 작성하십시오. (거대한 쓰레기처럼 보인다)

어떤 통찰력이라도 있습니까?

참고 : 나는 실제로 당신이 함수의 출력에 UNIQUE 제약 조건을 수행 할 수

+0

왜 subgroup_name의 정리되지 않은 버전을 저장 하시겠습니까? 나는 너의 생각을 이해하려고 노력하고있어. 분명히 그룹 + 하위 그룹 ID의 깨끗한 버전과 표시 이름을 제공하는 조회 테이블이 있습니다. –

+0

정리되지 않은 버전을 사용자 인터페이스에 표시하고 싶습니다. 나는 대문자 버전을 표시하고 싶지 않을 것이고 그 이름이 대소 문자가 구별되지 않는지 확인하고 싶습니다. 하위 그룹 회원, 메시지와 연결된 다른 개체를해야합니다. 이러한 오브젝트를 포함하는 테이블에는 서브 그룹 테이블에 대한 외부 키가 있습니다. 나는 subgroup_id에 동등하게 깨끗한 subgroup_name를 참조하십시오. 이 사용자 표시의 경우 – akp

+1

그래서, 당신은 어쨌든 조회 테이블에 넣고 싶을 것이다. 그들은 아마 어떤 시점에서 display-name을 변경하기를 원할 것입니다. 그들은 항상 그렇습니다. –

답변

0

포스트 그레스 9.2을 사용하고 있습니다. 테이블 정의에서 그렇게 할 수는 없습니다. 당신이해야 할 일은 후에 유일한 색인을 만드는 것입니다. 그래서 같은 것을 : PostgreSQL을 절대적으로 놀라운 인덱싱 기능의 수, 기능 출력에 고유 한 (독특한 부분) 인덱스를 생성 할 수있는 능력을 가지고

CREATE UNIQUE INDEX subgroups_ukey2 ON subgroups(group_id, upper(trim(subgroup_name))); 

는 매우 과소 평가입니다.