2010-06-03 13 views

risposta

12

Con un database di documenti è necessario duplicare i dati in una certa misura. Che cosa è questo grado dipenderà dal tuo sistema e dai casi d'uso.

Per esempio, se abbiamo un semplice blog e utente aggregati potremmo configurarli come:

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; } 
    } 
    } 

In questo esempio ho nidificato una classe BlogUser all'interno della classe di blog con le proprietà Id e nome del User Aggregate associato al blog. Ho incluso questi campi perché sono gli unici campi in cui è interessata la classe Blog, non è necessario conoscere il nome utente o la password degli utenti quando viene visualizzato il blog.

Queste classi nidificate dipenderanno dai casi di utilizzo del sistema, quindi è necessario progettarle con cura, ma l'idea generale è di provare e progettare Aggregati che possono essere caricati dal database con una singola lettura e che conterranno tutti i dati necessari per visualizzarli o manipolarli.

Questo porta quindi alla domanda di cosa succede quando User.Name viene aggiornato.

Con la maggior parte dei database di documenti è necessario caricare tutte le istanze di Blog che appartengono all'utente aggiornato e aggiornare il campo Blog.BlogUser.Name e salvarli tutti nel database.

Raven è leggermente diverso in quanto supporta le funzioni di set per gli aggiornamenti, quindi è possibile eseguire un singolo aggiornamento su RavenDB che aggiornerà la proprietà BlogUser.Name dei blog degli utenti senza che sia necessario caricarli e aggiornarli tutti individualmente.

Il codice per fare l'aggiornamento entro RavenDB (il modo manuale) per tutti i blog di sarebbe:

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() 
    } 

ho aggiunto nelle SaveChanges tanto per fare un esempio. Il client RavenDB usa il modello Unit of Work e quindi questo dovrebbe accadere davvero da qualche parte al di fuori di questo metodo.

+0

Supporta effettivamente le funzioni di impostazione, per l'aggiornamento comunque –

+0

Quindi è sicuro dire che è necessario replicare tutti i dati che altrimenti sarebbe necessario recuperare da un altro documento e utilizzare le funzioni di set per aggiornare/mantenere i dati duplicati? Come sarebbe l'aggiornamento (renderebbe la risposta molto meglio!). Grazie! –

+0

@Jon Ho aggiunto un esempio di come farlo a lungo, non ho ancora esaminato le operazioni di Ravens. Lo esaminerò e aggiungerò un esempio. –

2

Non c'è una risposta "giusta" alla tua domanda. IMHO. Dipende veramente da quanto sono mutevoli i dati che stai duplicando.

Dai uno sguardo allo RavenDB documentation per molte risposte sulla progettazione del documento DB rispetto a quella relazionale, ma in particolare consulta la sezione "Gestione associazioni" del documento Document Structure Design Considerations. In breve, i DB di documenti utilizzano i concetti di riferimento per ID quando non vogliono incorporare dati condivisi in un documento. Questi ID non sono come i FK, sono interamente compatibili con l'applicazione per garantire l'integrità e la risoluzione.

Problemi correlati