Comment puis-je éviter de dupliquer les données dans une base de données de documents comme RavenDB?

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

  •  24-10-2019
  •  | 
  •  

Question

Étant donné que les bases de données de documents, tels que RavenDB, sont non-relationnel, comment pouvez-vous éviter de dupliquer les données que plusieurs documents ont en commun? Comment préservez-vous que les données s'il est correct de le dupliquer?

Était-ce utile?

La solution

Avec une base de données de documents que vous devez dupliquer vos données à un certain degré. Qu'est-ce que ce degré est dépendra de votre système et les cas d'utilisation.

Par exemple, si nous avons un simple blog et des agrégats utilisateurs que nous avons pu les mettre en place comme:

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

Dans cet exemple, j'ai imbriqué une classe BlogUser dans la classe Blog avec les propriétés ID et le nom de l'utilisateur Aggregate associés au Blog. J'ai inclus ces domaines car ils sont les champs que la classe de blog est intéressé, il n'a pas besoin de connaître les utilisateurs Nom d'utilisateur ou mot de passe lorsque le blog est affiché.

Ces classes imbriquées vont fonction de vos systèmes cas d'utilisation, vous devez les concevoir avec soin, mais l'idée générale est d'essayer et de conception des agrégats qui peuvent être chargés à partir de la base de données avec une seule lecture et ils contiennent tous les données requises pour afficher ou de les manipuler.

Ce qui nous amène à la question de savoir ce qui se passe lorsque le User.Name est mis à jour.

Avec la plupart des bases de données de document que vous devez charger toutes les instances de Blog qui appartiennent à l'utilisateur mis à jour et mettre à jour le champ Blog.BlogUser.Name et les enregistrer tous à la base de données.

Raven est légèrement différente, car il prend en charge les fonctions ensemble des mises à jour, vous êtes en mesure d'exécuter une seule mise à jour contre RavenDB qui mettra à jour la propriété BlogUser.Name des blogs des utilisateurs sans que vous devez les charger et les mettre à jour individuellement .

Le code pour faire la mise à jour dans RavenDB (le mode manuel) pour tous les années de blog serait:

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

J'ai ajouté dans les SaveChanges comme un exemple. Le RavenDB Client utilise l'unité de modèle de travail et donc cela quelque part devrait vraiment se produire en dehors de cette méthode.

Autres conseils

Il n'y a pas une « bonne » réponse à votre question à mon humble avis. Cela dépend vraiment de la façon dont mutable les données que vous dupliquiez est.

Jetez un oeil à la documentation RavenDB pour beaucoup de réponses sur la conception documents DB par rapport relationnel, mais spécifiquement consultez la section "gestion associations" du Structure document document Considérations de conception. En bref, le document DB utilisent les concepts de référence par ID quand ils ne veulent pas intégrer des données partagées dans un document. Ces identifiants ne sont pas comme FKs, ils sont entièrement à l'application pour assurer l'intégrité et la détermination.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top