设计游戏数据库

时间:2010-04-20 03:22:05

标签: sql database-design mysql

我正在尝试设计一个数据库来记录我正在进行的游戏的游戏历史记录。我有3个不同的表:用户,gamehistories和游戏核心。

表格列:

用户:uid,displayname,email
gamehistories :gid,pubID,start(datetime),end(datetime)
游戏币:gid,uid,得分

我试图在给定userID(uid)的情况下生成以下结果集:
对手的显示名称,我的分数,对手的得分,持续时间

有什么想法吗?我的设计好吗?如何查询这些表以获取给定uid的游戏历史记录?

3 个答案:

答案 0 :(得分:3)

我会选择这样的东西

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

不确定您希望如何链接到 gamehistories 表。

答案 1 :(得分:0)

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

就在我的脑海中,如果我没有使用任何特殊的sql魔法,请不要使用,但我通常会使用连接。

我没有看到任何关于你的表格的明显坏事,但你确实需要一个gamecore id字段,只是为了自动递增唯一id,如果没有别的。我的政策是给每张桌子一个id,但那就是我。

答案 2 :(得分:0)

好吧,由于有两位玩家参与每场比赛,我建议将gamehistories牌桌与gamescores牌桌合并:

  • 用户 uid,displayname,email
  • 游戏 gid,pubID,start,end,uid1,score1,uid2,score2

这样可以减少检索所需信息所需的联接数,但会增加一个细微差别 - 您不知道您的用户ID是否位于uid1uid2列中,因此您拥有查询两者。

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)