Wie kann ich es vermeiden, Daten in einer Dokumentdatenbank wie Ravendb zu duplizieren?

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

  •  24-10-2019
  •  | 
  •  

Frage

Wie vermeiden Sie angesichts der Tatsache, dass Dokumentendatenbanken wie Ravendb nicht relationale Daten sind, doppelte Daten, die mehrere Dokumente gemeinsam haben? Wie pflegen Sie diese Daten, wenn es in Ordnung ist, sie zu duplizieren?

War es hilfreich?

Lösung

Mit einer Dokumentdatenbank müssen Sie Ihre Daten bis zu einem gewissen Grad duplizieren. Was dieser Abschluss ist, hängt von Ihren System- und Anwendungsfällen ab.

Wenn wir beispielsweise ein einfaches Blog- und Benutzeraggregat haben, könnten wir sie als:

  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 diesem Beispiel habe ich eine Bloguser -Klasse in der Blog -Klasse mit den ID- und Namenseigenschaften des mit dem Blog zugeordneten Benutzeraggregats verschachtelt. Ich habe diese Felder aufgenommen, da sie die einzigen Felder sind, an denen die Blog -Klasse interessiert ist. Sie muss nicht den Benutzername oder das Passwort des Benutzers kennen, wenn das Blog angezeigt wird.

Diese verschachtelten Klassen sind von Ihren Systemanwendungsfällen abhängig. Sie müssen sie daher sorgfältig entwerfen. Die allgemeine Idee besteht jedoch darin, Aggregate zu entwerfen, die mit einer einzigen Lektüre aus der Datenbank geladen werden können und alle erforderlichen Daten enthalten sie anzeigen oder manipulieren.

Dies führt dann zu der Frage, was passiert, wenn der Benutzer.name aktualisiert wird.

Bei den meisten Dokumentdatenbanken müssten Sie alle Instanzen des Blogs laden, die zum aktualisierten Benutzer gehören, und das Feld blog.bloguser.name aktualisieren und sie alle zurück in der Datenbank speichern.

Raven ist etwas anders, da die IT -Unterstützung für Updates für Aktualisierungen unterstützt wird. Sie können also ein einzelnes Update gegen RavendB ausführen, das den Bloguser -Nennelement der Benutzer -Blogs erhält, ohne dass Sie sie laden und alle individuell aktualisieren müssen.

Der Code für das Update in Ravendb (der manuelle Weg) für alle Blogs wäre:

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

Ich habe als Beispiel in den Savechanges hinzugefügt. Der Ravendb -Client verwendet die Einheit des Arbeitsmusters, so dass dies wirklich irgendwo außerhalb dieser Methode geschehen sollte.

Andere Tipps

Es gibt keine "richtige" Antwort auf Ihre Frage imho. Es hängt wirklich davon ab, wie veränderlich die Daten, die Sie duplizieren, sind.

Schauen Sie sich das an die Ravendb -Dokumentation Für viele Antworten zum Dokument DB -Design vs. Relational, aber genau den Abschnitt "Associations Management" der Überlegungen zum Entwurf von Dokumentenstrukturen dokumentieren. Kurz gesagt, Dokument DBS verwenden die Referenzkonzepte durch IDs, wenn sie gemeinsam genutzte Daten in ein Dokument einbetten möchten. Diese IDs sind nicht wie FKs, sie sind ganz der Anwendung, um die Integrität von und zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top