0

클라이언트간에 엄격하고 중요한 데이터 분리를 사용하는 멀티 테넌트 데이터베이스가 있습니다. 프로덕션에 들어가기 전에, 내 접근 방식이 합리적인지 아니면 문제가 보안 ​​/ 성능/유지 보수로 이어질 수 있는지 알고 싶습니다. 이 개 모델은 일반적인 시나리오입니다 아래 :멀티 테넌트 데이터베이스에서 ClientId를 처리하는 방법

public class Car 
{ 
    [Key, Column(Order=0)] 
    public int carId {get;set;} 

    [Key, Column(Order=1)] 
    public int clientId {get;set;} 

    ... 

    public virtual ICollection<Component> components {get;set;} 
} 

public class Component 
{ 
    [Key, Column(Order=0)] 
    public int componentId {get;set;} 

    [Key, Column(Order=1)] 
    public int clientId {get;set;} 

    ... 

    [ForeignKey("carId, clientId")] 
    public Car car {get;set;} 
    public int carId {get;set} 
} 

이 방법으로 모든 모델은이 .Find (함께 사용하도록 강요) 및 많은 많은 관계를 조인 테이블로 강제, 기본 키 클라이언트 ID를 가지고 . 이는 약간의 중복성이 있음을 의미하며 클라이언트 ID는 데이터 분리에 대해 실제로 쿼리가 안전 할 때 사용됩니다.

클라이언트 ID를 아무 것도 지정하지 않거나 부모 모델에서만 유지하는 것이 더 좋을 수도 있습니다.

+0

clientId를 기본 키로 사용 하시겠습니까? 또는 외래 키? –

+0

위의 코드에서 clientId는 실제 id 속성과 함께 복합 키를 형성합니다. 하지만 그게 내가 고민하는거야. 복합 PK에 포함시키고 추가 "체커 (checker)"로 쿼리에 넣거나 유지하고 부모 모델에서만 사용합니다. 특히 보안이 중요합니다. 나는 경험이 없기 때문에 길 아래의 함의를 볼 수 없다. –

+0

왜 스키마 당 임차인을 사용하지 않습니까? –

답변

1

이것이 올바른 방법이라고 생각합니다. 우리는 특허 테이블에서만 클라이언트와 함께 설계하고 이후 다양한 자식 테이블로 그것을 비정규 화하는쪽으로 옮겼습니다. 이는 하위 테이블에서 구동되는 쿼리에서 사용할 수 있음을 의미합니다. 또한 클라이언트별로 테이블을 분할 할 수 있습니다.

1

제가 이것을 설계한다면, 데이터베이스를 운영하는 응용 프로그램 코드가 철저하게 테스트되고 고품질로 쓰여지고 이런 식으로 중복성이 추가되는지 확인해야합니다.

이렇게 중복을 추가하면 코드와 데이터베이스를 관리하기가 더 어려워지고 성능 문제가 발생할 수 있습니다 (회사 주장을하기에 충분한 세부 정보가 없지만 모양이 비슷합니다).

+0

여기의 중복성은 모든 하위 테이블의 추가 정수 필드와 조인 테이블의 2 개의 추가 정수입니다. 따라서 여전히 관리가 가능하지만 거기에 있습니다. –

관련 문제