Come posso evitare la duplicazione dei dati in un database di documenti come RavenDB?

StackOverflow https://stackoverflow.com/questions/2968193

  •  24-10-2019
  •  | 
  •  

Domanda

Dato che i database di documenti, come ad esempio RavenDB, sono non-relazionali, come si fa a evitare la duplicazione di dati che più documenti hanno in comune? Come si fa a sostenere che i dati se va bene a duplicarlo?

È stato utile?

Soluzione

Con un database di documenti è necessario duplicare i dati in una certa misura. Cosa che grado è dipenderà vostri casi sistema e utilizzare.

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 il nome del Aggregate utente associato con il Blog. Ho incluso questi campi così come sono i campi solo è interessato nella classe Blog, non ha bisogno di conoscere gli utenti nome utente o password quando viene visualizzato il blog.

Queste classi nidificate stanno andando a dipendere sui sistemi casi d'uso, in modo da avere a progettare con attenzione, ma l'idea generale è quella di cercare di aggregati di design che possono essere caricate dal database con una sola lettura e che conterrà tutte i dati necessari per visualizzare o manipolarli.

questo allora porta alla questione di ciò che accade quando l'User.Name viene aggiornato.

Con la maggior parte dei database di documenti che si dovrebbe caricare tutte le istanze di Blog che appartengono al utente aggiornata e aggiornare il campo Blog.BlogUser.Name e salvare tutti indietro al database.

Raven è un po 'diverso in quanto supporta le funzioni di set per gli aggiornamenti, in modo che siano in grado di eseguire un singolo aggiornamento contro RavenDB cui verrà data fino alla proprietà BlogUser.Name dei blog degli utenti, senza bisogna caricarli e aggiornare tutti singolarmente .

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 RavenDB Client utilizza l'Unità di modello di lavoro e quindi questo in realtà dovrebbe accadere in qualche luogo fuori di questo metodo.

Altri suggerimenti

Non c'è nessuno "giusta" risposta alla tua domanda IMHO. Dipende veramente su come mutabile i dati che stai duplicando è.

Date un'occhiata alla RavenDB documentazione per un sacco di risposte su documento DB disegno vs. relazionale, ma specificamente controllare la sezione "Associazioni di Gestione" del href="http://ravendb.net/documentation/docs-document-design" rel="nofollow noreferrer"> documento Struttura design Considerations documento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top