设计游戏数据库

问题描述:

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

列于表:

用户:UID,显示名称,电子邮件
gamehistories:GID,发布商ID,开始(日期时间),结束(日期时间)
gamescores: gid,uid,得分

我试图给出用户ID(uid)下面的结果集:
对手的显示名称,我的得分,对手的得分,持续时间

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

+0

有多少玩家可以同时参与游戏? pupID的目的是什么? – Dathan 2010-04-20 03:34:36

+0

2名球员。 pubID是为游戏生成的网址哈希。 – Ronald 2010-04-20 03:45:15

我会的东西是这样的

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表。

+0

where子句中的列'uid'含糊不清? – Ronald 2010-04-20 03:41:33

+0

我修正了这个,对不起。你可以再看看。 – 2010-04-20 03:43:53

+0

谢谢。仍然没有工作,虽然:重复列名'UID' – Ronald 2010-04-20 03:47:45

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魔术我没有使用,但我通常使用连接为此。

我没有看到关于表格的任何明显不好的内容,但是您确实需要一个gamescore id字段,仅用于自动递增唯一标识,如果没有其他内容。我的政策是给每张桌子一个ID,但那只是我。

+1

你的查询有一些明显的缺陷。您只需要检索一个分数 - 您需要两次加入“gamescores”才能检索对手的分数和用户的分数。通过选择'h。*',您只能满足输出要求中的'duration'字段。 – Dathan 2010-04-20 03:36:23

好了,与事实两名选手参加每场比赛,我建议用gamescores表巩固gamehistories表武装:

  • 用户 UID,显示名称,电子邮件
  • 游戏 GID ,pubID,开始,结束,uid1,score1,uid2,score2

这会导致检索t他需要的信息,但增加了一个细微差别 - 您不知道您的用户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)