2014-09-11 6 views
4

DocumentDb에서 데이터를 분리하여 별도의 컬렉션에 저장하는 가장 좋은 방법은 무엇입니까?DocumentDb의 여러 컬렉션에 데이터 저장

지금까지 DocumentDb로 데이터를 관리하는 방법의 대부분은 단순한 개체를 사용하지만 실생활에서는 거의 수행하지 않습니다. DocumentDb에서 Json 객체로 저장하기 전에 복잡한 클래스를 어떻게 처리해야 하는지를 이해하고 싶습니다.

다음 예를 살펴 보겠습니다. 내 프로젝트 정보를 Projects 컬렉션에 저장 하겠지만 프로젝트 문서에 프로젝트 팀원의 전체 이름을 저장하고 싶지는 않습니다. 나는 그들의 EmployeeId를 프로젝트 문서에 저장하려고한다. 개인/직원 특정 정보를 저장하려는 별도의 직원 컬렉션이 있습니다. 내 프로젝트 개체는 다음과 같습니다

public class Project 
{ 
    [JsonProperty(PropertyName="id")] 
    public int ProjectId {get; set;} 

    [JsonProperty(PropertyName="projectName")] 
    public string ProjectName {get; set;} 

    [JsonProperty(PropertyName="projectType")] 
    public string ProjectType {get; set;} 

    [JsonProperty(PropertyName="projectTeam")] 
    public List<TeamMember> ProjectTeam {get; set} 
} 

내 TeamMember 클래스는 Employee 객체에서 상속 및 다음과 같습니다

내 Employee 클래스는 다음과 같습니다
public class TeamMember : Employee 
{ 
    [JsonProperty(PropertyName="position")] 
    public string Position {get; set;} 
} 

:에 저장하기 전에

public class Employee 
{ 
    [JsonProperty(PropertyName="id")] 
    public int EmployeeId {get; set;} 

    [JsonProperty(PropertyName="firstName")] 
    public string FirstName {get; set;} 

    [JsonProperty(PropertyName="lastName")] 
    public string LastName {get; set;} 

    [JsonProperty(PropertyName="gender")] 
    public string Gender {get; set;} 

    [JsonProperty(PropertyName="emailAddress")] 
    public string EmailAddress {get; set;} 
} 

프로젝트 컬렉션은 다음과 같습니다. 내 프로젝트 문서의 모양 예 :

{ 
    id: 12345, 
    projectName: "My first project", 
    projectType: "Construction Project", 
    projectTeam: [ 
     { id: 7777, position: "Engineer" }, 
     { id: 8998, position: "Project Manager" } 
    ] 
} 

보시다시피 프로젝트 데이터를 자신의 컬렉션 인 Projects 및 Employees 컬렉션에 각각 저장하기 위해 직원 데이터에서 프로젝트 정보를 분리했습니다.

데이터를 분리해야하는 이유는 무엇입니까? 가장 빠른 결과를 얻기 위해 어떻게 그리고 어디에서 디커플링을 처리해야하는지 알고 싶습니다. Best Practice에 따라 DocumentDb을 사용하는 전문가가이 시나리오를 처리하는 방법을보고 싶습니다.

을 나는이 문제를 처리하기 위해 두 곳 생각할 수 있지만이 작업을 수행 할 수있는 더 나은, 더 직접적인 방법이 있는지 이해 할 :

    내 C# 코드 내에서 JSON 객체로 내 프로젝트 클래스를 변환 할 수 있습니다
  1. 저장을 위해 DocumentDb에 JSON 객체를 전달합니다.
  2. 또는 내 Project 개체를 DocumentDb에 직접 전달하고 JavaScript 저장 프로 시저에 전달할 수 있으며 DocumentDb 내의 두 개 이상의 컬렉션에서 데이터를 분리하고 저장할 수 있습니다. 여기

는 내가 알고 싶은 내용은 다음과 같습니다

감 데이터를 처리 할 수있는 권리 장소입니다
  1. ?
  2. 더 나은 성능을 제공합니까?
  3. 이 문제를 해결하는 더 좋은 방법이 있습니까? 나는 내가 POCO 클래스를 DocumentDb에 전달할 수있는 방법에 대해 읽고있다. DocumentDb가이보다 복잡한 시나리오를 처리합니까? 그렇다면 어떻게?

감사합니다. 고맙습니다.

답변

7

과 같은 NoSql 저장소에서 동일한 스키마에 다른 스키마를 가진 여러 유형의 문서를 저장할 수 있습니다.

컬렉션을 표로 취급하지 마십시오. 트랜잭션을 수행하는 파티션과 단위의 단위로 컬렉션을 생각하십시오.

그런 점에서 볼 때 프로젝트 문서를 저장하고 동일한 컬렉션에 직원 문서를 저장하는 데는 아무런 문제가 없습니다.

이제 그 모든 것을 말합니다. 그래도이 작업을 원한다면 ... 이 작업을 수행하려면 프로젝트 객체를 변경해야합니다. 대신 가진 TeamMember의 : 직원 (전체 직원의 객체를 포함 할 것) DocumentDB 프로젝트 개체를 직렬화 할 때와 끝날 것입니다 이제 즉

class TeamMember 
{ 
    int id {get;set;} 
    string position {get;set;} 
} 

... TeamMember 객체는 당신이 당신의 JSON에서 원하는 것을 모방이 JSON은 당신이 원하는 것과 흡사합니다. 그런 다음 Employee 객체를 별도로 저장할 수 있습니다.

모델의 정의를 제어하지 않거나 시스템의 다른 부분이이 부분에 의존하도록 작성 되었기 때문에이 작업을 수행하지 않거나 수행 할 수없는 경우에는 건물을 조사 할 수 있습니다 원하는 JSON을 뱉어내는 Project 객체 용 사용자 정의 JSON 변환기. 그런 다음 해당 JsonConverter로 Project 객체를 꾸미고 DocumentDB가 변환을 수행 할 때마다 올바른 결과가 만들어 질 것입니다.

+2

라이언, 네 말이 맞아! 나는 콜렉션을 테이블로 취급하고 있었다. 같은 컬렉션에 프로젝트와 직원을 모두 저장하면 쿼리 할 문서의 유형을 어떻게 알 수 있습니까? – Sam

+1

오늘 가장 쉬운 방법은 각 JSON 문서에 "type"속성을 추가하고이를 쿼리에 포함시키는 것입니다. WHERE type = project 또는 WHERE type = employee 오늘 어디서 3 절로 제한되어 있는지 알지만, 더 많은 것을 허용하기 위해 현재 변경 될 가능성이 있습니다. 다른 방법으로 쉽게 이해할 수 있다면 듣고 싶습니다. 의견을 보내 주시기 바랍니다. –

+0

다시 한 번 감사드립니다. Ryan – Sam