2017-01-05 3 views
0

다중 사용자 시나리오에서 사용할 데이터베이스를 설계하고 있습니다. 나는 최근에 tenant_ids가 서로를 참조하는 테이블간에 일관성을 유지하도록하기 위해 테이블 ​​ID와 tenant_id를 모두 포함하도록 테이블의 기본 키를 가져야 함을 알게되었습니다. 그런 다음 외래 키는 테이블 ID와 tenant_id를 모두 참조해야합니다.임차인의 외래 키 제약 조건이 적용된 SQL 스키마 디자인

의도 한대로 작동하는 것 같습니다. 그러나 임차인을 참조하지 않는 테이블이 있으면 어떻게됩니까? 아래 예에서 나는 임차인을 직접 참조하지 않는 playlist_item을 가지고 있습니다. 여기서 볼 수있는 문제는 playlist_item이 잠재적으로 소유하고있는 재생 목록과 동일한 임차인이없는 콘텐츠를 참조 할 수 있다는 것입니다.

가능한 해결책은 데이터베이스에 존재하는 모든 테이블에 tenant_id를 포함 시켜서 항상 임차인을 참조 할 수있게하는 것이지만,이 방법은 나에게 조금 성가시다. 왜냐하면 playlist_item (이 경우)에는 이미 재생 목록과의 소유자 관계를 통해 묵시적 tenant_id가 있습니다.

이 경우 좋은 해결책이 무엇인지에 대한 통찰력과 일치하지 않는 데이터의 잠재적 위험없이 동일한 목표를 달성 할 수있는 대안적인 방법이 있다면 감사하겠습니다.

Sample schema design

+1

참조 된 열 (외래 키 관계)은 참조 된 테이블에서 항상 고유 키 (PostgreSQL의 기본 키 또는 고유 제한)를 형성해야합니다. 그래서 위의 예를 실제로 만들 수는 없습니다.'id '가'playlist'와'content'의 기본 키가 아니라면 말이죠. 고유 한 제한 조건 인 경우 기본 키의 "일부"가되는 것은 의미가 없습니다 (고유 한 자체이기 때문에). 다시 말해, 엔티티가 겹치는 ID를 가질 수있는 엔티티 (입주자를 통해)를 결정해야합니다. 당신의'user' 테이블 f.ex. 가질 수있다. – pozs

+0

당신이 맞습니다, 또한 테이블 ID에 고유 인덱스가 필요합니다. 결과는 기본 키 (id, tenant_id) 및 고유 (id)입니다. 권리? – Patrik

+0

은 기술적으로 가능하지만 기본 키는 항상 고유 한 가장 작은 열 집합이어야합니다. 그래서 하나의 가능성은'id'를 프라이 머리 키로 만들고 테이블에'tenant_id'를 * some *를 포함시키는 것입니다 (다른 외래 키를 통해 세입자와 연결될 수 있다면 필요하지 않습니다) id' +'tenant_id' 기본 키. – pozs

답변

1

(이건 그냥 샘플이 아닌 실제 데이터베이스입니다) 당신은 여기에 두 가지 기본 옵션이 있습니다.

첫 번째는 추가 외래 키와 tenant_id이 포함 된 고유 제약 조건을 추가하는 것입니다. 이렇게하면 같은 거주자가 전체적으로 참조되도록 할 수 있습니다. 행 레벨 보안 정책을 사용하려면 보안 점검시 성능 문제를 해결해야하므로이 작업을 수행하십시오.

이 경우 재생 목록에는 (id, tenant_id)에 두 번째 고유 색인이 있고 playlist_item에는 (playlist_id, tenant_id)에 외래 키가 있습니다.

두 번째 옵션은 tenant_id이 전이 참조되는 곳을 드롭하는 것입니다. 이 경우 조인을 통해 항상 찾을 수 있지만 행 수준의 보안을 사용하려고하면 성능이 떨어집니다.

관련 문제