2016-02-29 5 views
0

Je travaille sur un projet parallèle pour créer un forum construit sur RavenDB. J'essaie actuellement de mettre au point la relation entre les Auteurs de Sujets, et l'utilisateur "Dernière Réponse" sur un sujet. Dans un modèle relationnel typique, je stockerais simplement le FK à l'utilisateur qui a posté le sujet, et je ferais une jointure avec la table des réponses pour obtenir l'auteur des réponses les plus récentes. Ce n'est évidemment pas le cas d'utilisation pour Raven ou n'importe quel magasin de documents d'ailleurs.RavenDB Relational Model

Quelle serait la manière la plus "optimale" de tirer ceci? Actuellement, je suis en train de lancer quelques idées. Enregistrez le FK de l'auteur sur le modèle Topic, ajoutez un objet utilisateur JsonIgnored que je vais remplir sur le sujet en utilisant un include dans ma session load (donc une requête si loin du côté client) , rend juste la charge et le modèle un peu compliqués). Puis éventuellement en utilisant un index map-reduce pour obtenir l'auteur des réponses les plus récentes (ou même la même méthode que pour obtenir l'auteur du sujet, donc 1 ou 2 requêtes en fonction).

Idée 2: Sauvegarde de l'auteur et de la réponse la plus récente Utilisateur sur le modèle. Principal "problème" ici est le potentiel pour les données périmées (dire si un nom d'utilisateur change). Cependant, cela pourrait potentiellement être allégé avec une tâche de fond (ou simplement garder cela à l'esprit lors de la mise à jour d'un document utilisateur et revenir sur tous les messages d'un utilisateur).

Exemple des modèles en question.

public class User 
{ 
    public string Id { get; set; } 
    public string UserName { get; set; } 
    public string PasswordHash { get; set; } 
} 

public class Topic 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public string Body { get; set; } 

    // Idea 1 Relationships 
    public string AuthorId { get; set; } 
    [JsonIgnore] 
    public User Author { get; set; } // Would need to be populated on loads from an Include on AuthorId 
    public string MostRecentReplyUserId { get; set; } 
    [JsonIgnore] 
    public User MostRecentReplyUser { get; set; } // Same as Author 

    // Idea 2 Relationships 
    public User Author { get; set; } 
    public User MostRecentReplyUser { get; set; } 
} 

Note: Je probablement ajouter une méthode au modèle de l'utilisateur pour retourner une version « propre » où je délogeons des choses comme le PasswordHash et l'utiliser sur Save pour Idea 2. Selon

Répondre

0

sur vos besoins en cas de mise à jour et d'exécution des requêtes dans les deux sens peuvent être le meilleur choix.

Personnellement, je recommanderais la première idée parce que vous n'avez pas besoin de mettre à jour les documents existants lorsque certaines données changent sur les dossiers de l'utilisateur. Utiliser include sur query/load time est une fonctionnalité intéressante de ravendb qui peut vous aider lors de la récupération d'enregistrements imbriqués dans la base de données. Assurez-vous de ne pas oublier d'inclure tous les documents imbriqués - sinon vous pourriez avoir plusieurs allers-retours.

L'incorporation de documents (comme Idea 1 mais avec une valeur stockée des utilisateurs) peut être améliorée si le traitement des données est séparé de la récupération des données et que vous n'avez pas accès à la base de données lors de la conversion des données. à l'interface. Nous utilisons un tel système qui repose fortement sur cela (obtenir une entrée et mapper un pendentif json de la valeur) - cela sépare complètement la logique de récupération de données de la logique de sortie (comme mappage vers json). Inconvénient ici: Vous devez vous assurer que les données (incorporées) existantes sont mises à jour chaque fois qu'un utilisateur change et que les données transférées sur le réseau sont plus que sur l'idée 1.