4 votes

Conception d'une base de données de jeux

J'essaie de concevoir une base de données pour enregistrer les historiques de jeu pour un jeu sur lequel je travaille. J'ai 3 tables différentes : utilisateurs, historique des jeux, et scores des jeux.

Colonnes pour les tableaux :

utilisateurs : uid, displayname, email
histoires de jeux : gid, pubID, start (datetime), end (datetime)
gamescores : gid, uid, score

J'essaie de produire l'ensemble de résultats suivant à partir d'un identifiant d'utilisateur (uid) :
Nom de l'adversaire, mon score, le score de l'adversaire, la durée.

Des idées ? Ma conception est-elle correcte ? Comment puis-je interroger ces tables pour obtenir l'historique des jeux pour un identifiant donné ?

3voto

astander Points 83138

Je choisirais quelque chose comme ça

SELECT  u.displayname OpponentsName,
        gsYours.score MyScore,
        gs.score OpponenetsSCore
FROM    gamescores gs INNER JOIN
        (
            SELECT  gs.gid,
                    gs.uid,
                    gs.score
            FROM    gamescores gs 
            where   gs.uid = yourUserID
        ) gsYours   ON  gs.gid = gsYours.gid
                    AND gs.uid <> gsYours.uid INNER JOIN
        users u ON gs.uid = u.uid INNER JOIN
              gamehistories gh ON gs.gid = gh.gid AND gh.pubID = whatYouRequireHere

Je ne suis pas vraiment sûr de la façon dont vous souhaitez établir un lien avec le site Web de la Commission européenne. histoires de jeux table.

0voto

Charles Points 1666
select h.* from gamehistories as h join gamescores as g on g.gid=h.gid join users as u on g.uid=u.uid where u.uid=$uid

Je ne sais pas s'il y a une magie spéciale sql que je n'utilise pas, mais j'utilise généralement des jointures pour cela.

Je ne vois rien de flagrant dans vos tables, mais vous avez besoin d'un champ id gamescore, juste pour l'incrémentation automatique de l'id unique, si ce n'est pour autre chose. C'est ma politique de donner à chaque table un identifiant, mais c'est juste moi.

0voto

Dathan Points 4144

D'accord, armé du fait que deux joueurs participent à chaque partie, je suggère de consolider les gamehistories table avec le gamescores table :

  • utilisateurs uid, displayname, email
  • jeux gid, pubID, début, fin, uid1, score1, uid2, score2

Cela permet de réduire le nombre de jointures nécessaires pour récupérer les informations souhaitées, mais ajoute une nuance - vous ne savez pas si votre identifiant d'utilisateur se trouvera dans le fichier uid1 o uid2 vous devez donc interroger les deux.

SELECT users.displayname AS `Opponent Name`,
    score1 AS `Your Score`,
    score2.score AS `Opponent Score`,
    TIMEDIFF(end, start) AS `Duration`
FROM
    users INNER JOIN games ON users.uid = games.uid1
WHERE games.gid = (TheGID)
    AND games.uid2 = (YourUID)
UNION
SELECT users.displayname AS `Opponent Name`,
    score2 AS `Your Score`,
    score1.score AS `Opponent Score`,
    TIMEDIFF(end, start) AS `Duration`
FROM
    users INNER JOIN games ON users.uid = games.uid2
WHERE games.gid = (TheGID)
    AND games.uid1 = (YourUID)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X