2013-01-04 2 views
1

D'abord laissez-moi vous donner un peu de contexte.Base de données et organisation du programme en C#

J'ai des données qui ressemble à ceci:

  • Runner1 | Date1 | Time1 | Laps1 | Time2 | Laps2 | ... | Time50 | Laps50
  • Coureur1 | Date2 | Time1 | Laps1 | Time2 | Laps2
  • Coureur1 | Date3 | Time1 | Laps1 | ... | Time32 | Tours 32

Signification: le coureur a un nombre différent de temps et de tours pour chaque date.

Voici une maquette de la façon dont je l'ai créé ma base de données SQL:

(désolé pour l'art ASCII, mais il est ma première question)

|Runner |  |RunnerTimes | |Time | 
|RunnerID|-----|RunnerTimesID |----|TimeID | 
       |RunnerID  | |Laps | 
       |TimeID  | |Duration| 
       |Date   | 

Mon problème est que j'ai un code qui a été créé avant la base de données:

public class iRunner 
{ 
    public int[] laps; 
    public TimeSpan[] duration; 
} 
public static class RunnerFunctions 
{ 
    public static double AverageLaps(iRunner runner) 
    { 
     return runner.laps.Average(); 
    } 
} 

Je peux donc obtenir toutes les données de mon coureur en utilisant:

Runner runner = dbContext.Runner.Where(item=>item.RunnerID == 1); 

Ensuite, je dois « convertir » au format de classe:

iRunner r = new iRunner(); 
r.Laps = runner.RunnerTimes.Select(a=>a.Laps).toArray(); 
r.Duration = runner.RunnerTimes.Select(a=>a.Duration).toArray(); 

Et puis je peux réellement appeler les méthodes qui sont pré-existantes:

Double average = RunnerFunctions.Average(runner); 

Maintenant que vous avez l'arrière-plan , voici mes questions:

  1. Est-ce la bonne façon de modéliser mes données en SQL?
  2. Existe-t-il un meilleur moyen de "convertir" ma structure SQL en mes classes et fonctions existantes?

Quelques données supplémentaires:

  1. La structure que je l'ai montré ci-dessus est faux, mais ressemble à ma structure réelle
  2. je convertir 3 mille entrées dans une table, cela prend 500 ms pour récupérer toutes les données de la base de données, mais en prenant environ 4 minutes pour convertir dans la structure de classe existante.

Merci beaucoup!

+0

Vous avez dit que le code a été créé avant la base de données - voulez-vous dire que vous ne pouvez pas refactoriser ou modifier le code? Aussi, êtes-vous lié à l'utilisation du framework Entity? –

Répondre

0

Si le code existe en premier, vous pouvez envisager d'utiliser l'approche Code d'abord avec Entity Framework.

Entity Framework Code First: Let's Try It

+0

Salut Saleh, le problème avec cette approche que nous avons trouvé est que les structures dans les classes ne fonctionnent pas avec le code d'abord, par exemple, comment pouvons-nous utiliser une propriété qui est un tableau d'entiers? comme la propriété de tours int [] Laps? Merci pour votre réponse de toute façon. – Deco

+0

Vous pouvez utiliser une table pour les coureurs et une table pour les tours par exemple et une troisième table pour le mappage du coureur aux tours. La table de mappage aura RunnerID et LapID afin que vous ayez une cardinalité de un à plusieurs. De la même manière, vous aurez la cartographie des coureurs à Durations. –

0

Votre conception de schéma est proche de ce que j'utilise:

Runner 
======== 
id -- autoincrement 

Run 
========== 
runnerId -- fk to Runner.id 
startedAt -- timestamp 
laps -- int count 
duration -- int duration in milliseconds/seconds 
      -- (unless your RDBMS has a 'duration' type). 

RunnerTimes ne semble pas être d'une grande utilité pour le moment, à moins que vous finissez par nous fournir plus infos 'monde réel'.
Surtout avec le nombre de courses donc variable, c'est ce que je recommande.

Personnellement, je trouve le code préexistant un peu suspect (a-t-il vraiment des membres de données publiques comme ça?). Aussi, pourquoi ne pouvez-vous pas faire le côté de la base de données moyenne (soit directement, ou si Linq-to-SQL le supporte, de cette façon)? Et à la fois les 500ms pour la récupération et 4 minutes pour le convertir ridiculement long; combien de rangées y a-t-il par coureur? Avez-vous les indices nécessaires? Et je ne sais pas assez sur les cadres pertinents, mais je soupçonne que runner.RunnerTimes.Select(...) fait plus de travail qu'il le devrait.

Questions connexes