2012-02-27 1 views
0

Je suis nouveau à RavenDB et j'essaie toujours de trouver la meilleure façon de modéliser les données pour le scénario actuel. Voici à quoi ressemblent les données.Comment modéliser des statistiques de jeu de football dans RavenDB

Game 
- Teams 
    - Team 1 
    - list of players 
    - Team 2 
    - list of players 
- Events 
    - Event 1 
    - type: Pass 
    - teamId 
    - PlayerId 
    - Event 2 
    - type: Goal 
    - teamId 
    - PlayerId 

Au début de chaque jeu, nous obtenons l'information globale pour le jeu (par exemple les équipes, lieu, etc.), puis toutes les quelques minutes, nous obtenons une liste mise à jour des événements. De plus, je dois pouvoir interroger des données pour un joueur particulier en pensant au jeu (par exemple combien de passes a un joueur)

Est-ce que je le stocke comme un seul document? Dois-je scinder les événements en un document séparé, par exemple GameEvents? Y a-t-il un troisième scénario?

Répondre

1

Stockez-le comme un seul objet - la structure que vous avez définie est géniale. Ensuite, il suffit de définir des index pour les différents types de requêtes que vous allez faire. Ne pas avoir à décomposer les choses en tables avec des relations est ce qui rend les DB de documents comme Raven génial - idéal pour les scénarios comme ce que vous décrivez.

+0

Si vous allez avec cette méthode, pour * la plupart * de vos statistiques, vous feriez mieux de charger le document entier (ce qui représente 1 jeu), le traiter en mémoire et ensuite le réécrire dans le document. Pour les statistiques qui sont à travers plusieurs jeux, vous pouvez regarder dans Map/Reduce –

+0

Matt qui semble être une bonne idée. Juste pour être clair si je veux calculer des passes pour un joueur je voudrais charger le document de jeu, faire les calculs et le sauvegarder encore. – marto

+0

@Matro, ouais c'est l'idée même s'il y a des frais généraux pour faire cela beaucoup de fois, donc Patching pourrait vous aider. http://ravendb.net/docs/client-api/partial-document-updates –

3

Je ne m'inquiéterais pas de la façon dont cela sera stocké dans RavenDB. C'est la beauté des bases de données de documents; ne pense pas relationnellement. Créez votre modèle de domaine de la manière orientée objet qu'il doit être créé (une équipe aura une propriété List <Player>, etc ...), puis enregistrez simplement les entités si nécessaire.

J'ai eu l'intention de bloguer sur la façon dont j'ai gardé mon modèle de domaine pur tout en utilisant RavenDB. J'ai besoin de publier cela ...

** EDIT ** J'ai finalement publié ce blog: http://bit.ly/xUsYJK. Cela montre comment Presto a conservé un modèle de domaine quelque peu pur tout en utilisant RavenDB.

Par ailleurs, Daniel Lang a un bon blog sur ce sujet:

http://daniellang.net/how-to-handle-relations-in-ravendb/

J'utilise Inclure l'approche <T> parce que je tiens à garder mes entités de domaine faisant référence les uns des autres dans ce que je envisager une manière appropriée. Daniel a également une section intitulée "Denormalize your references." Certaines personnes préfèrent cette méthode.

1

En pensant à combien de tels événements peuvent se produire pendant un jeu, je crois que vous voulez absolument les avoir comme documents séparés. De cette façon, vous n'avez pas besoin de charger et mettre à jour le document de jeu sur chaque événement entrant, car cela serait également très coûteux si les documents devenaient très volumineux.

Pour obtenir des statistiques sur tous les événements d'un jeu, je préfère avoir des index qui collectent les données appropriées.

+0

C'était ma pensée originale. Un document de jeu avec des événements peut atteindre environ 1 Mo de taille.Si je sépare les événements, c'est environ la moitié de la taille et le reste de l'objet de jeu est mis à jour moins souvent. La seule autre chose est que le document sera mis à jour seulement pendant le match de football et jamais plus, c'est pourquoi j'ai commencé avec un doc. – marto

+0

Il n'y a pas d'inconvénient à avoir de nombreux documents, donc je ne vois pas l'intérêt d'avoir tous ensemble dans le document de jeu. Sachant que votre document de jeu sera de 1 Mo - ce qui est à peu près - je recommanderais certainement d'avoir des documents séparés pour les événements afin d'éviter le chargement et la mise à jour de l'ensemble du document de jeu. –

Questions connexes