2010-06-03 2 views

답변

12

문서 데이터베이스를 사용하면 데이터를 어느 정도 복제해야합니다. 그 정도는 시스템 및 사용 사례에 따라 다릅니다. 우리는 간단한 블로그와 사용자 집계가있는 경우

예를 들어 우리는 그들을 설정할 수 있습니다 :

나는의 ID와 이름 속성 블로그 클래스 내부 BlogUser 클래스를 중첩 한이 예에서는
public class User 
    { 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
    } 

    public class Blog 
    { 
    public string Id { get; set; } 
    public string Title { get; set; } 

    public class BlogUser 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
    } 
    } 

블로그와 관련된 User Aggregate. 블로그 클래스가 관심있는 유일한 필드이므로 블로그가 표시 될 때 사용자 이름이나 비밀번호를 알 필요가 없습니다.

이러한 중첩 클래스는 시스템 유스 케이스에 따라 달라 지므로 신중하게 설계해야하지만 일반적으로 단일 읽기를 사용하여 데이터베이스에서로드 할 수있는 집계를 시도하고 설계하는 것이 좋습니다. 데이터를 표시하거나 조작하는 데 필요한 모든 데이터.

그러면 User.Name이 업데이트 될 때 어떤 일이 발생하는지 묻습니다.

대부분의 문서 데이터베이스에서는 업데이트 된 사용자에 속한 모든 Blog 인스턴스를로드하고 Blog.BlogUser.Name 필드를 업데이트하고 다시 데이터베이스에 저장해야합니다.

Raven은 업데이트 기능을 지원하기 때문에 약간 다르므로 RavenDB에 대한 단일 업데이트를 실행하면 사용자 블로그의 BlogUser.Name 속성을 최신으로 업데이트하여 업데이트하지 않고도 모두 업데이트 할 수 있습니다 개별적으로

수있는 모든 블로그에 대한 RavenDB 내 업데이트 (수동 방식) 작업을위한 코드 :

public void UpdateBlogUser(User user) 
    { 
    var blogs = session.Query<Blog>("blogsByUserId") 
        .Where(b.BlogUser.Id == user.Id) 
        .ToList(); 

    foreach(var blog in blogs) 
     blog.BlogUser.Name == user.Name; 

    session.SaveChanges() 
    } 

난 그냥 예제로 SaveChanges를 추가했습니다. RavenDB Client는 Unit of Work 패턴을 사용하기 때문에이 메소드 밖에서 실제로 발생해야합니다.

+0

어쨌든 업데이트를 위해 세트 기능을 실제로 지원합니까? –

+0

그렇다면 다른 문서에서 검색해야하는 데이터를 복제해야하며 세트 기능을 사용하여 복제 된 데이터를 업데이트/유지 관리해야한다고 말하는 것이 안전합니까? 그 업데이트는 어떻게 생겼을까요? (당신의 대답은 훨씬 나아졌습니다!). 감사! –

+0

@ 존 나는 먼 길을 예로 든 예를 추가했는데 레이븐이 아직 작업을 설정하지 않은 것으로 보았습니다. 살펴보고 예제를 추가하겠습니다. –

2

IMHO에 대한 "올바른 답변"이 없습니다. 복제하는 데이터가 얼마나 가변적인지에 따라 달라집니다.

문서 DB 디자인과 관계형에 대한 많은 답변을 보려면 RavenDB documentation을 살펴보고 Document Structure Design Considerations 문서의 "연결 관리"섹션을 자세히 확인하십시오. 즉, 문서 DB는 공유 데이터를 문서에 포함하지 않으려는 경우 ID로 참조 개념을 사용합니다. 이 ID는 FK와는 다르며, 무결성을 보장하고 해결하기 위해 전적으로 애플리케이션에 달려 있습니다.

관련 문제